Object 对象方法
1. 对象原始转换
对象中不存在布尔转换,只有字符串和数值转换
数值转换发生在对象相减或应用数学函数时
字符串转换通常发生在 alert()
输出时
为了进行转换,JavaScript
尝试查找并调用三个对象方法:
-
obj[Symbol.toPrimitive](hint)
-
obj.toString()
-
obj.valueOf()
1-1 Symbol.toPrimitive
Symbol.toPrimitive
的内建 symbol
,它被用来给转换方法命名
如果 Symbol.toPrimitive
方法存在,可以用来处理所有的转换场景
类型转换有三种变体,它们被称为 hint
:
string
:对象到字符串的转换,当我们对期望一个字符串的对象执行操作时number
:对象到数字的转换,例如当我们进行数学运算时default
:当运算符不确定期望值的类型时
obj[Symbol.toPrimitive] = function(hint) {
// 这里是将此对象转换为原始值的代码
// 它必须返回一个原始值
// hint = "string"、"number" 或 "default" 中的一个
}
let obj = {
name: 'jsx',
age: 22,
money: true,
[Symbol.toPrimitive](hint) {
console.log(hint)
return hint == 'string' ? `{name: '${
this.name}'}` : this.age;
}
}
console.log(obj + 2); // 24
console.log(obj + 'ljj'); // 22ljj
console.log(+obj); // 22
1-2 toString() & valueOf()
如果没有 Symbol.toPrimitive
,那么 JavaScript
将尝试寻找 toString
和 valueOf
方法,转换并不限制返回类型
- 对于
string hint
:toString
,如果它不存在,则valueOf
- 对于其他
hint
:valueOf
,如果它不存在,则toString
默认情况下,普通对象具有 toString
和 valueOf
方法:
toString
方法返回一个字符串[object Object]
valueOf
方法返回对象自身
let obj = {
name: 'jsx',
age: 22,
money: true,
valueOf: function() {
return this.age
},
toString: function() {
return this.name
}
}
// toString 返回字符串
console.log(obj + 3); // 22
// valueOf 返回对象自身
console.log(`${
obj}`); // jsx
2. 属性方法
2-1 检测属性
obj.hasOwnProperty(prop)
prop
:要检测的属性的String
字符串形式表示的名称,或者Symbol
方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性,不检测原型链上继承的属性
let obj = {
name: 'jsx',
age: 22
}
console.log(obj.hasOwnProperty('name')); // true
// 在obj的原型对象中有hasOwnProperty属性
console.log(obj.hasOwnProperty('hasOwnProperty')); // false
2-2 获取属性名
Object.getOwnPropertyNames(obj)
返回一个由指定对象的所有自身属性的属性名组成数组
包括不可枚举属性但不包括 Symbol
值作为名称的属性
let obj = {