JavaScript基础—对象

一、对象的基础

对象(object)是 JavaScript 语言的核心概念,也是最重要的数据类型。

什么是对象?简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。

var obj = {
    foo:'value1',
     bar:12,
    5:'aaa'
}

上面代码通过大括号定义了一个有三个属性的对象,赋值给了变量obj:

键(key) 值(value)
foo 'value1'
bar 12
'5' 'aaa'

可以直观的看出:

1、通过大括号定义对象;

2、键与值通过冒号分隔;

3、键值对之间通过逗号分隔;

4、键名跟一般变量有点特殊,可以用数字作为键;

5、值可以是任意类型的数据

下面主要介绍一下键名

键名:在ES6之前,对象的所有键名都是字符串,可加可不加引号,ES6又引入了Symbol值也可以作为键名。

上面的代码等价于:

var obj = {
    'foo':'value1',
    'bar':12,
    '5':'aaa'
}

如果键名是数值,会被自动转换为字符串,例如下面:

var obj = {
  1: 'a',
  3.2: 'b',
  1e2: true,
  1e-2: true,
  .234: true,
  0xFF: true
};

obj
// Object {
//   1: "a",
//   3.2: "b",
//   100: true,
//   0.01: true,
//   0.234: true,
//   255: true
// }

obj['100'] // true

如果键名不符合标识符的条件,且也不是数字,则在定义的时候必须加上引号,否则报错,如下示例:

// 报错
var obj = {
  1p: 'Hello World'
};

// 不报错
var obj = {
  '1p': 'Hello World',
  'h w': 'Hello World',
  'p+q': 'Hello World'
};

通常我们把键名叫做“属性”,但是我们又根据键值的数据类型不同,把键值为函数的属性叫做“方法”,因为它可以像函数一样执行。

另外要注意的一点是:上述的obj变量实际存储的是一个内存地址值,而这个地址值所在的内存空间才是对象的实际存储位置。

二、对象的属性的操作

  • 属性的读取

读取对象的属性,有两种方式,点运算和方括号运算。

var obj = {
    foo:'value1',
    bar:12,
    5:'aaa'
}
obj.foo // value1
obj.bar // 12
obj['5'] // aaa
obj['foo'] // value1

注意:点运算读取属性,适用于键名为合法的变量名标识;方括号运算读取属性是万金油,但是要把键名放在引号里面,否则会被当做变量处理

var foo = 'bar';

var obj = {
  foo: 1,
  bar: 2
};

obj.foo  // 1
obj[foo]  // 2
  • 属性的赋值

同样是通过d点运算和方括号运算来进行,这里就不赘述

  • 查看所有属性

查看一个对象本身的所有属性,可以使用Object.keys方法,返回一个由键名组成的数组

var obj = {
    foo:'value1',
    bar:12,
    5:'aaa'
}
Object.keys(obj)// ['foo','bar','5']
  • in运算符

in 运算符y用于检测对象是否包含某个属性,如果包含就返回true,否则返回false

var obj = {
    foo:'value1',
    bar:12,
    5:'aaa'
}
'foo' in obj //true
'foof' in obj //false
'toString' in obj //true

‘foo’是obj的属性所以返回true;‘foof’不是obj的属性所以返回的是false;但是‘toString’好像也不是我们的属性啊,怎么就返回了true呢。

in 运算符,它不能识别哪些属性是对象自身的,哪些属性是继承的。而toString是继承来的,所以就返回了true;

要判断是否为自身的属性,需要使用Object.hasOwnProperty('toString')

  • for …in循环

for...in循环用来遍历一个对象的可遍历的全部属性。

var obj = {
    foo:'value1',
    bar:12,
    5:'aaa'
}
for (var i in obj) {
  console.log(obj[i]);
}
// aaa
// value1
// 12

for…in循环有以下三个主要的特点:

  1. 它只遍历对象可遍历(enumerable)的属性;

  2. 不仅遍历本身的属性,也遍历继承来的属性;

  3. 遍历是无序的,跟定义时的顺序无关;

如果继承的属性是可遍历的,那么就会被for...in循环遍历到。但是,一般情况下,都是只想遍历对象自身的属性,所以使用for...in的时候,应该结合使用hasOwnProperty方法,在循环内部判断一下,某个属性是否为对象自身的属性

var obj = {
    foo:'value1',
    bar:12,
    5:'aaa'
}
for (var key in obj) {
  if (obj.hasOwnProperty(key)) {
    console.log(key);
  }
}

三、失宠的with语句

with的语法格式:

1with (对象) {
2  语句;
3}

它的作用是操作同一个对象的多个属性时,提供书写的便利,直接上代码

var obj = {
    foo:'value1',
    bar:12,
    5:'aaa'
}
with(obj){
   foo = '我是通过with设置的';
   bar = '我变了'
}
// 等价于
obj.foo = '我是通过with设置的';
obj.bar = '我变了'

乍一看,貌似很溜,然而溜翻了。当你操作一个不是对象属性的变量的时候,实际上在with的父作用域下进行的操作,因为with语句并没有去创建一个新的作用域,这就存在了一个很大的弊端:绑定对象不明确,无法判断所操作的变量是谁的,只有在运行的时候才能确定,从而拖慢了运行速度。

所以with被称作为"失宠的with语法",它的初衷是好的,但是实现确是坑爹的。

所以在工作中,建议不要使用with语法。

以上是一些JavaScript对象的一些基础知识,希望能对你有所帮助。欢迎关注同步微信公众号:前端小菜的进阶之路

公众号:Mr-Small_Teem

猜你喜欢

转载自blog.csdn.net/jingsi1991/article/details/83905021