JavaScript对象——属性描述符

定义对象有两种方式:

var obj = {"a":1,"b":2}

或者

var obj = new Object();
obj.a = 1;
obj.b = 2;

我们一般都会用第一种方式吧?第二个还要逐个添加呢,太麻烦了。
有没有想过定义一个属性a,难道这个a就是光杆司令,只有一个值吗?
其实吧,每一个属性都有一群小兵呢,它们叫做属性描述符,就是详细描述这个属性的。看代码:

var obj = {"a":1};
Object.getOwnPropertyDescriptor(obj,"a");
//{
//  value: 1
//  writable: true
//  enumerable: true
//  configurable: true
//}

哇!一个属性都这么多东西呢。不着急,下面我们一个一个来研究它们都是干嘛的。


writable

writable决定是否可以修改属性的值。

var obj = {};
Object.defineProperty(obj,"a",{
    value: 1,
    writable: false,    //注意!不可写
    configurable: true,
    enumerable: true
})

obj.a;  //1
obj.a = 2;
obj.a;  //1

看到没有,我们通过Object.defineProperty()方法定义了属性a以及它的属性描述符。当属性描述符writablefalse的时候,对该属性重新赋值是没有效果的。
上面代码是在非严格模式下的,如果在严格模式下面呢:

'use strict';
var obj = {};
Object.defineProperty(obj,"a",{
    value: 1,
    writable: false,    //注意!不可写
    configurable: true,
    enumerable: true
})

obj.a = 2;  //Uncaught TypeError: Cannot assign to read only property 'a' of object

语法错误,不可以修改只读的属性。


configurable

只要属性是可配置的,就可以使用defineProperty()方法修改属性描述符。

var obj = {a:2};

obj.a = 3;
obj.a;  //3

Object.defineProperty(obj,"a",{
    value: 4,
    writable: true,
    configurable: false,    //不可配置
    enumerable: true
});

obj.a;    //4
obj.a = 5;
obj.a;    //5(赋值是可以的,有writable控制)

Object.defineProperty(obj,"a",{
    value: 6,
    writable: true,
    configurable: true,
    enumerable: true
});    //TypeError: Cannot redefine property: a

注意

  • 即使属性是configurable: false,也可以把writable的状态由true改为false,但是无法由false改为true。
  • 除了无法修改,configurable: false还会禁止删除这个属性:
var obj = {a:2};
obj.a;    //2
delete obj.a;
obj.a;    //undefined

Object.defineProperty(obj,"a",{
    value: 2,
    writable:true,
    configurable: false,
    enumerable: true
});

obj.a;    //2
delete obj.a;
obj.a;    //2,没有删除该属性

enumerable

控制属性是否会出现在对象的属性枚举中。

var obj = {};

Object.defineProperty(obj,"a",{
    value: 2,
    enumerable: true
});

Object.defineProperty(obj,"b",{
    value: 3,
    enumerable: false
});

obj.b;    //3,虽然不可枚举,但是可以访问
("b" in obj);    //true
obj.hasOwnProperty("b");    //true

for(var k in obj) {
    console.log(k, obj[k]);    //"a" 2
}

注意:for..in不要用于数组。因为in可以检查是否有某个属性值,如果一个数组含有其他属性(当然给数组添加属性不常见),遍历数组的话,和你想象的不一样:

var arr = [1,2,3];
arr.a = 1;
for(var k in arr)    
    console.log(k, arr[k]);    
//0 1
//1 2
//2 3
//a 1

我们也可以通过另一种方式来区分属性是否可以枚举:

var obj = {};

Object.defineProperty(obj,"a",{
    value: 2,
    enumerable: true
});

Object.defineProperty(obj,"b",{
    value: 2,
    enumerable: false
});

obj.propertyIsEnumerable("a");    //true
obj.propertyIsEnumerable("b");    //false

Object.keys(obj);    //["a"]
Object.getOwnPropertyNames(obj);    //["a", "b"]
  • propertyIsEnumerable()会检查给定的属性名是否直接存在于对象中(而不是在原型链上),并满足enumerable: true。
  • Object.keys()和Object.getOwnPropertyNames()都只会查找对象直接包含的属性。
  • Object.keys()会返回一个数组,包含所有可枚举属性。
  • Object.getOwnPropertyNames()会返回一个数组,包含所有属性,无论它们是否可枚举。
  • in和hasOwnProperty()的区别在于是否查找原型链
Object.prototype.a = 1;

var obj = {b: 2};
for(var k in obj) {
    console.log(k);    //b, a 
}

可以看到,in在查找对象属性时遍历原型链上的所有属性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 字符串对象JavaScript中的一种数据类型,用于表示文本数据。字符串对象可以包含任何字符,包括字母、数字、符号和空格等。在JavaScript中,字符串对象是不可变的,也就是说一旦创建就不能修改。但是可以通过一些方法来操作字符串对象,如拼接、截取、替换等。常见的字符串方法有concat()、slice()、replace()等。掌握字符串对象的使用可以帮助我们更好地处理文本数据。 ### 回答2: JavaScript字符串对象是一个在JavaScript中非常重要的事物。JavaScript字符串对象可以帮助我们在JavaScript编程中进行文本操作。通过了解字符串对象,可以使我们更有效地处理字符串数据,并让我们的代码更加强大。 JavaScript中的字符串对象具有很多方法和属性,可以帮助我们对字符串进行各种操作。以下是一些常用的字符串对象方法: 1. length属性:返回字符串的长度。 2. charAt()方法:返回指定索引位置的字符。 3. concat()方法:连接两个或多个字符串。 4. slice()方法:提取字符串的一部分,并返回一个新字符串。 5. substr()方法:从指定位置开始提取长度为指定的字符。 6. replace()方法:替换字符串中的指定文本。 7. split()方法:将字符串转换为数组。 8. toLowerCase()方法:将字符串转换为小写。 9. toUpperCase()方法:将字符串转换为大写。 在JavaScript中处理字符串非常重要,因为在处理表单、验证用户输入等方面都需要使用到字符串。字符串对象也是最常用的JavaScript对象之一,因此熟悉JavaScript字符串对象将有助于提高程序的效率和简洁性。 需要特别注意字符串是不可修改的,一旦创建了一个字符串对象,就无法修改它的值。所以,任何字符串的修改操作都将返回一个新的字符串。 在编写程序时,应根据需要选择适当的字符串操作方法和属性。例如,在向用户显示错误消息时,可能需要使用charAt()方法或slice()方法来提取并显示错误消息中的第一个字符或前几个字符。或者,在对用户输入进行验证时,可以使用indexOf()方法或search()方法来检查输入的字符串中是否包含特定的字符或字符串。 总之,JavaScript字符串对象是处理JavaScript编程中文本数据的重要工具。通过了解字符串对象的各种方法和属性,可以更加有效和灵活的处理和操纵字符串数据。 ### 回答3: JavaScript中的字符串对象是一个字符串值的表示。它提供了对字符串值的访问和操作。JavaScript字符串是Unicode字符串,因此它们可以包含任何Unicode字符(包括多字节字符)。 字符串对象的主要方法有: 1. charAt()方法-返回指定索引的字符。该索引是基于零的。例如: var str = "hello world"; console.log(str.charAt(1)); //输出e 2. concat()方法-将一个或多个字符串连接到原始字符串,并返回新字符串。例如: var str1 = "hello "; var str2 = "world"; var newStr = str1.concat(str2); console.log(newStr); //输出hello world 3. indexOf()方法-返回第一个匹配的字符索引。如果没有找到匹配项,则返回-1。例如: var str = "hello world"; console.log(str.indexOf("world")); //输出6 4. lastIndexOf()方法-返回最后一个匹配的字符索引。如果没有找到匹配项,则返回-1。例如: var str = "hello world"; console.log(str.lastIndexOf("l")); //输出9 5. replace()方法-替换字符串中的字符。例如: var str = "hello world"; console.log(str.replace("world", "everyone")); //输出hello everyone 6. slice()方法-从字符串中提取指定的字符。例如: var str = "hello world"; console.log(str.slice(0, 5)); //输出hello 7. split()方法-将字符串拆分为子字符串,并返回一个数组。例如: var str = "hello world"; console.log(str.split(" ")); //输出["hello", "world"] 字符串对象JavaScript中最常用的对象之一。它提供了许多方法,可以让您对字符串执行各种操作,包括搜索、提取和更改字符。熟练掌握这些方法,可以使您在JavaScript中更有效地处理字符串值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值