js 问题,自定义对象

如图所示,'2':'a','3':'b','length':8,'push':Array.prototype.push这里2,3,length,push都是obj的属性,而且都是字符,为什么length属性可以使用obj.length访问而2,3,却不行?然后麻烦详细说下属性名带引号和不带引号的区别??

不管加没加引号,对象的属性名都是字符串。
但是在调用属性时,如果属性名本身是数值,则不能以 obj.2 这样的形式进行调用,只能用 obj["2"] 这种形式调用。为什么呢,请看下面的例子:
首先,假定 obj.2 这样的调用方式是合法的,那么下面的语句也没问题:
alert(obj.2);
但是,如果改成下面这样的方式呢?
with(obj){
alert(2);
}

这时候你究竟让系统把2作为obj的属性呢,还是纯粹的数字2?
所以,为了防止混淆,js中规定所有的名称(比如变量名、对象名、函数名、属性名等等)都要以字母(或者下划线)开头,不能以数字或其他符号开头(当然纯数字就更不可以了)。其实几乎所有的编程语言都有这样的规定的。
至于自定义对象中的数字形式的键,其实并不算是属性名,我们可以把它理解为类似于数组(数组也是对象)中的序号或者索引号。
再补充说一句:尽可能避免用数字来作为对象的键名!追问

用数字做建名是建立一个类数组不是么?

追答

如果所有键名都是数字,那就直接建立一个数组了。但是这种数字和字母混杂的情况,很容易引起混淆,而且会造成阅读困难,本来属性名的作用就是帮助代码使用者理解后面值的作用(比如length、push都具有这种作用),但数字(2、3)却无法直观表达意思。我所说的避免的就是指后面这种情况。

其实也可以在对象中包含数组啊,这样层次更加分明。比如:

var obj = {
    'data': [
        'a',
        'b'
    ],
    'length': 8,
    'push': Array.prototype.push
}

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-08-03

    通过[]操作符为对象添加属性时,属性名称可以是任何字符串(包括只包含空格的字符串和空字符串);

    通过.操作符为对象添加属性时,属性名称必须是合法的标识符名称;

    如果属性名包含非法的标识符字符,则只能采用obj[“propertyName”]的形式;

    如果属性名是合法的标识符,读取时即可以采用obj.propertyName,也可以采用obj[“propertyName”]的形式;

纯数字属性名的使用比较特殊,可以通过对象字面量和obj[number]的形式为对象添加纯数字属性,解释器会自动将数字转换为数字字符串。

追问

感谢

相似回答