Object 类型
Object类型是ES中使用最多的一个类型;Object实例不具备多少功能,主要用于程序中存储和传输数据;对象字面量表示法用于对象定义的优点:简化创建包含大量属性的对象的过程;
var person = new Object(); person.name = 'Nicholas'; person.age = 29;var person = { name: 'Nicholas', age: 29 };var person = {}; person.name = 'Nicholas'; person,age = 29;表达式上下文(expression context):指的是能够返回一个值 语句上下文(statement context):表示一个语句块的开始
上下文:指的是有歧义的代码或符号根据上下 context 决定效果取向,类似高中的阅读理解:请联系上下文回答问题。
{}可以用于 指示对象实例,还可以用于 包住代码块。 能准确识别是因为赋值操作符=表示后面是一个待返回的值的表达式,这时{就表示一个表达式的开始(对象字面量的开始)。{跟在if语句的后面则表征一个语句块的开始,不会视为对象字面量解析。对象属性名全部默认为字符串,属性为数值会被转换为字符串,可使用引号,也可不使用;属性名可以包含特殊字符、保留字、关键字!
var a = { '!@#$%^': 'test', // 不推荐包含特殊字符 'first name': 'Fucheng', // 不推荐使用空格分割单词 lastName: 'Young' // 规范写法 } alert(a['!@#$%^']); // 使用 [] 正常访问 alert(a['first name']); // 使用 []最佳实践:
- 最后一个属性不添加逗号;(
IE 7,Opara视为语法错误) - 属性名:不使用引号,不使用保留字,关键字,不使用特殊符号;
- 最后一个属性不添加逗号;(
对象字面量法
{}定义对象实际上并不是调用Object构造函数;对象字面量法:代码量少,能够给人封装数据的感觉;
对象常常用来向函数传递大量可选参数,这样能防止为函数定义过多的命名参数:
function displayInfo(args, role) { var output = ""; // 不要只声明,不初始化 // 可选参数使用对象字面量传入,函数内部判断、取舍 if (typeof args.name === 'string') { output += 'Name: ' + args.name + '\n'; } if (typeof args.age === 'number') { output += 'Age: ' + args.age + '\n'; } // 必需值使用命名参数 output += 'Role: ' + role + '\n'; alert(output); } // 包装数据,准备传入函数 var yangfch3 = { name: 'yangfch3', age: 21 } displayInfo(yangfch3, 'husband'); displayInfo({ name: 'liuhq3' }, 'wife');最佳实践:定义函数时,必需值使用指定的命名参数,而使用对象字面量来封装多个可选参数(见 No.10 );
JavaScript也可以使用方括号表示法来访问对象的属性,注意:使用方括号时,属性以字符串形式放在方括号内alert(husband['name']); // yangfch3 alert(wife.name); // liuhq3方括号语法的优点:一下两种情况使用
[],其他情况一律使用.- 可以通过变量来访问属性,
- 如果属性名包含会导致语法错误的特殊字符,或者属性名使用的是关键字或者保留字,使用方括号访问包容性强一些。
var propertyName = 'name'; alert(person[propertyName]); // yangfch3 alert(person.propertyName); // error: propertyName is not defined alert(person['first name']); // 空格是特殊字符,使用 [] alert(person['!@#$%^&*']); // 属性名包含特殊字符,使用 []