深入了解JS中通过[]和.获取对象属性的区别

一般来说,‘.‘运算符和[]可以相互替代,比如

1 let obj = {
2     name : ‘sena‘
3 };
4
5 console.log(obj.name)     // ‘sena‘
6 console.log(obj[name])   // ‘sena‘

在这之上,我们需要了解关于他们的一些限制

.运算符:  右侧必须是一个属性名称命名的简单标识符

[] :  右侧必须是一个计算结果为字符串的表达式

先复习一下JS中的标识符:

/*
 标识符
- 在JS中所有的可以由我们自主命名的都可以称为是标识符
- 例如:变量名、函数名、属性名都属于标识符
- 命名一个标识符时需要遵守如下的规则:
  1.标识符中可以含有字母 、数字 、下划线_ 、$符号
  2.标识符不能以数字开头
  3.标识符不能是ES中的关键字或保留字
  4.标识符一般都采用驼峰命名法
- JS底层保存标识符时实际上是采用的Unicode编码,
所以理论上讲,所有的utf-8中含有的内容都可以作为标识符
*/

嗯,这里就可以看出.的缺陷了,如果对象中的属性刚好不符合标识符的规范,就不能用.来访问

比如说:

let obj = {"1" : 123}
console.log(obj.1);        // Uncaught SyntaxError: Unexpected number

let obj1 = {"star gf" : ‘sion‘};   console.log(obj1.star gf);  //Uncaught SyntaxError

所以这里只能用[]

let obj = {"1" : 123}

obj["1"]          // 123
let obj1 = {"star gf" : ‘sion‘};   console.log(obj1[‘star gf‘]);   // sion

然后我们再来看看[]

[]右边必须是一个计算结果为字符串的表达式,这给了[]非常强大的功能

let target = ‘name‘;
let obj3 = {
    name : ‘sena‘
};

//使用变量
console.log(obj3[target]);        //sena
//使用字符串拼接
console.log(‘na‘ + ‘me‘);         //sena

如果[]里面不是一个表达式,而是一个原始值或者对象,事情就开始变得有意思起来了,总结了一下规律大概就是下面两个

1. 如果里面的是一个原始值,那么就直接把原始值变成相应的字符串(0 -> ‘0‘ , true -> ‘true‘ ,  null -> ‘null‘,  undefined -> ‘undefined‘)(值得注意的是不是调用相应包装类原型上的toString(),而且undefined和null也没有包装类)

2.如果里面的不是一个原始值,那么就调用toString变成字符串

/*调用toString的情况*/let obj1 = {
    ‘name‘ : ‘sena‘,
    ‘true‘ : ‘sion‘,
};

let obj2 = {
    toString(){
        return ‘name‘;
    }
};

let arr5 = [];
arr5.toString = function(){
    return ‘name‘;
};

function fun() {
    return ‘name‘;
}

fun.toString = function () {
    return ‘name‘;
};

console.log(obj1[obj2]);     //sena
console.log(obj1[fun]);      //sena
console.log(obj1[arr5]);    //sena
/*直接转化的情况*/let obj3 = {
    "undefined" : 1,
    "null" : 2,
    "true" : 3,
    "1" : 4,
    ‘name‘ : ‘sena‘
};

/*重写了包装类的原型toString*/
Boolean.prototype.toString = function(){
    return ‘name‘;
};

console.log(obj3[1]);         //4
console.log(obj3[true]);     //3    这里可以证明没有调用包装类上的toString
console.log(obj3[null]);     //2
console.log(obj3[undefined]);   //1

原文地址:https://www.cnblogs.com/Himeno-Sena/p/11374704.html

时间: 2024-07-31 10:21:28

深入了解JS中通过[]和.获取对象属性的区别的相关文章

JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别

JS中isPrototypeOf 和hasOwnProperty 的区别 1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的原型链中,是则返回true,否则返回false. 格式如下: object1.isPrototypeOf(object2); object1是一个对象的实例: object2是另一个将要检查其原型链的对象. 原型链可以用来在同一个对象类型的不同实例之间共享功能. 如果 object2 的原型链中包含

js中遍历数组、对象的方式

1.标准的for循环遍历数组 var array = [1,2,3,4,5,6,7]; for (var i = 0; i < array.length; i) { console.log(i,array[i]); } 2.for in 遍历对象 for in 以任意顺序遍历一个对象的可枚举属性. 因此当迭代那些访问次序重要的 arrays 时用整数索引去进行 for 循环 (或者使用 Array.prototype.forEach() 或 for...of 循环) . 一般常用来遍历非数组的对

JS中的内置对象简介与简单的属性方法

JS中的数组: 1.数组的概念: 数组是在内存中连续存储的多个有序元素的结构,元素的顺序称为下标,通过下标查找对应元素 2.数组的声明: ①通过字面量声明var arr1 = [,,,,] JS中同一数组可以储存多种不同的数据类型(但,同一数组一般只用于存放同种数据类型) 例如var arr1 = [1,"2",true,{"name":"啦啦啦"},[1,2]]; ②通过new关键字声明:var arr2 = new Array(参数); &g

JS获取对象“属性和方法”的方法

平时在写的代码过程中,经常会遇到对对象Object的数据处理.而在对对象的数据处理中,操作最频繁的是“数据引用”.“值的修改”.“获取关键字(属性)”.平时最烦的也是“获取关键字”,经常忘记怎么去获取,这里做一下整理. 既然要"获取关键字",那么得首先有一个对象才行.创建对象的方式很多,我自己惯用的方式有三种: 1.通过原始构造函数 new Object();创建一个对象,然后赋值: var testObj= new Object(); testObj.name = "sha

JavaScript -- 时光流逝(六):js中的正则表达式 -- RegExp 对象

JavaScript -- 知识点回顾篇(六):js中的正则表达式 -- RegExp 对象 1. js正则表达式匹配字符之含义 .     查找单个字符,除了换行和行结束符.\w    查找单词字符.\W     查找非单词字符.\d     查找数字.\D     查找非数字字符.\s     查找空白字符.\S     查找非空白字符.\b     匹配单词边界.\B     匹配非单词边界.\0     查找 NULL 字符.\n     查找换行符.\f     查找换页符.\r   

关于js中for in和foreach in的区别

js 中for in 和foreach in的区别 两个的作用都用来遍历对象,但为什么有了for in语句了还要foreach in语句呢,后来看了下foreach in开发的文档,foreach in是作为E4X标准的一部分在javascript 1.6中发布的,而且E4X不是ECMAScript标准的一部分. foreach…in语句已被废弃,E4X中的大部分特性已被删除,但考虑到向后兼容,foreach…in只会被禁用而不会被删除,可以使用ES6中新的for…of语句来代替. var 小青

js中数组遍历for与for in区别(强烈建议不要使用for in遍历数组)

转自: http://www.cnblogs.com/javaee6/p/4142270.html?utm_source=tuicool&utm_medium=referral js中遍历数组的有两种方式 1 2 3 4 5 6 7 8 9 var array=['a'] //标准的for循环 for(var i=1;i<array.length;i++){     alert(array[i]) } //foreach循环 for(var i in array){     alert(ar

JS中apply()与call()的含义与区别

JavaScript中,apply()与call()的含义一样,均为改变调用函数中的this指向.其中apply()与call()的第一个参数表示所要指向的对象,若调用函数无参数可不写,则默认为window.第一个参数后的参数表示调用函数的参数,其中apply()第一个参数后面的参数为一个数组,call()第一个参数后面为0或多个参数. 例: 1 window.x = 100; 2 3 4 var obj = {}; 5 obj.x = 1; 6 obj.test = function(a) {

EL表达式获取对象属性的原理

EL表达式获取对象属性的原理是这样的:以表达式${user.name}为例EL表达式会根据name去User类里寻找这个name的get方法,此时会自动把name首字母大写并加上get前缀,一旦找到与之匹配的方法,El表达式就会认为这就是要访问的属性,并返回属性的值. 所以,想要通过EL表达式获取对象属性的值,那么这个属性就必须有与之对应的get方法. 其实你要了解EL表达式的运行原理,它其实后台也对应的Java代码,它会先将你EL表达式中的对象属性的首字符大写,拼成getXX()方法,然后利用