js 如何用变量作为索引,找到js 对象 key 变量深层的属性

js对象属性的命名规则 - canger - 博客园
随笔 - 43, 文章 - 0, 评论 - 10, 引用 - 0
JS标识符的命名规则,即变量的命名规则:
标识符只能由字母、数字、下划线和‘$’组成
数字不可以作为标识符的首字符
对象属性的命名规则
通过[]操作符为对象添加属性时,属性名称可以是任何字符串(包括只包含空格的字符串和空字符串);
通过.操作符为对象添加属性时,属性名称必须是合法的标识符名称;
如果属性名包含非法的标识符字符,则只能采用obj[“propertyName”]的形式;
如果属性名是合法的标识符,读取时即可以采用obj.propertyName,也可以采用obj[“propertyName”]的形式;
var obj = new Object();
obj["home addr"]="Tianjin";
obj["!@#$%"]="!@#$%";
obj[""]="empty string";
obj[" "]="string contains only space";
在控制台中查看如下:
纯数字属性名的特殊性
  纯数字属性名的使用比较特殊,可以通过对象字面量和obj[number]的形式为对象添加纯数字属性,解释器会自动将数字转换为数字字符串。
  定义实例:
var obj = {1:"first"}
obj[2]="second";
obj["3"]="third";
  以上三种为对象添加纯数字属性的方法是等效的,控制台查看如下:
  读取的方式有两种:
obj[number]
obj["number"]
  需要注意,采用obj.number的方式读取纯数字属性名称时浏览器会报错,如下
布尔属性名的特殊性
布尔属性名和纯数字属性名有着相似的行为,如下
采用[]操作符读取对象属性时,js解释器执行的动作
采用obj[propertyName]的形式读取或创建对象属性时,解释器首先会检查propertyName是值类型字面量还是用户定义的变量,如果propertyName是值类型的字面量,则解释器自动将其转换为字符串后再读取或创建属性,如obj[1],obj[true]会被转换成obj["1"]、obj["true"].
如果propertyName是变量名称(或者是表达式),则解释器会读取变量内容(或对表达式求值),如果变量的值是字符串,则直接读取属性,如果是其他类型的数据,则转换为字符串后再读取属性。举例如下:
定义对象:
定义变量:
读取属性:
更特殊的,为obj添加undefined属性:
使用未初始化的变量c读取obj的undefined属性:
由于c没有初始化,所以将c转换为字符串的结果是“undefined”,而obj存在“undefined”属性。94被浏览14,463分享邀请回答5517 条评论分享收藏感谢收起var pubvar = 1;
function pub () {
var pravar = 2;
return pubvar + pravar;
alert(pub(2));
//调用pub()函数
此时后台会创建一个作用域链(scope chain),这个作用域链包含了全局环境的变量对象并被保存在pub()函数内部的scope属性中。但是,当我们打开浏览器的时候已经存在了一个全局的执行环境,这个全局的执行环境属于浏览器,JS里浏览器被称为window对象,我们把这个环境叫做A环境,只要没有关闭浏览器,A环境会一直存在下面会提到执行环境什么时候会被创建。我们用色块表示执行环境,链条表示作用域链,作用域链上半部分是活动对象区域,下半部分是变量对象区域,如下图:当我们要调用pub()函数的时候,又会创建一个执行环境B,没错,执行环境如其名是在运行和执行代码的时候才存在的,所以我们运行浏览器的时候会创建全局的执行环境。这个时候根据pub()函数scope属性中的作用域链把pub()函数内的变量对象放入新的B环境中,作用域链也得到更新,如下图:上图的虚线表示正在执行,全局变量对象此时处于作用域链的第二位,所以标号变成了1。你可能也注意到那个arguments对象,它是在函数被创建的时候就一直存在的,无需用户创建。arguments对象保存的是函数圆括号内定义的参数,准确来说保存的是参数的值,因这里我们没有设置参数,所以显示未定义。此时我们把属于B环境的变量对象(也就是pub()函数中的所有函数和变量)叫做活动对象。因此我们可以说变量对象包含了活动对象,活动对象就是作用域链上正在被执行和引用的变量对象。我们从活动对象的名称中也能看出 “执行、运行、激活” 等意味。你可以这样理解,整个代码的运行总有一个起始的对象吧,不管这个起始是变量还是函数,总要有一个称呼,虽然我们把执行环境中的变量和函数的总称叫做变量对象,但这不能反映代码的动态性,为了区别于普通的变量对象,我们创造了活动对象的概念。这就完了?没有,上一段我们说到代码的动态性,所谓动态性在这里的意思是有些代码参与了运行,有些没有,就像高中的化学反应一样,总有一些化学物不会参与到整个反应中来。我们把上面的代码变成如下:var pubvar = 1;
function pub () {
var pravar = 2;
return pubvar +
var pubvar2 = 3;
function pub2 () {
var pravar = 2;
return pubvar2 +
alert(pub(2));
//调用pub()函数
这个时候全局作用域链和执行环境如下:接着我们调用pub()函数,执行环境和作用域链如下:你看没有被调用的pub2()函数仍然只是闲着,甚至没有被pub()函数在内部引用。由于pub2()没有参与整个pub()函数的调用过程,所以pub2()中不存在活动对象,只有“处于静止状态”的变量对象,当然也没有创建执行环境。到这里就完了?也没有,我们刚才也只是讨论了两个平行且毫不关联的函数其中一个被调用的状况,言下之意就是也存在函数相互影响的例子,最典型的就是闭包,闭包是一种函数嵌套的情况。定义如下代码:function returnfunc (propertyName) {
return function (obj) {
//-----这行定义并返回了一个闭包,也被称之为一个匿名函数
return obj[propertyName];
//这里用方括号法访问属性,因为属性是变量(returnfunc()函数的参数)
var savefunc = returnfunc("name");
//调用returnfunc()
var result = savefunc({name:"Picasso"});//调用savefunc()
alert(result);
//返回字符串“Picasso”
以上代码的最开始的作用域链和执行环境:我们先开始调用returnfunc()函数,马上会创建一个包含returnfunc()变量对象的行环境,作用域链开始变化,如下图:图的白色虚线表示执行程序产生的效果,它可能表示的是返回一个结果、复制某种值、产生一个新物体、建立某种联系等。题外话:你会发现上图的arguments参数的值和propertyName的值是一样的,这是因为arguments保存的就是参数,采用实时映射的方式与参数建立联系,如果你在returnfunc()函数内再加一个值为{name:"picasso"},名为obj的参数,那么arguments的值变成[{name:"nicholas"},{name:picasso}],是的,你没看错,arguments是一个数组!!!随后returnfunc()函数会返回它内部的匿名函数,当匿名函数被返回后,整个作用域链和执行环境又发生了变化:我们看到匿名函数(闭包)被添加到了最作用域链的最前端,returnfunc()的执行环境被销毁,但我们注意到returnfunc()函数的活动对象仍然在被引用(匿名函数仍在访问propertyName参数),因此returnfunc()函数的变量对象仍然在内存中,成为活动对象。这就是为什么匿名函数就能访问returnfunc()函数定义的所有变量和全局环境定义的变量,毕竟returnfunc()的活动对象仍然保持“激活”状态。根据上面所述,随着代码一行一行的被执行、执行环境不断被创建和销毁、变量对象间的各种关系被建立,这些背后的逻辑导致活动对象也在不断变化,这足以证明活动对象只是正在被执行和引用的变量对象。我个人的理解是:活动对象是按照状态划分的一类变量对象,你也可以根据变量对象被调用次数的多少来定义一个常用对象和闲置对象,不过没人这么蛋疼。。。最后,设计狗还是很艰辛的,劳烦各位大爷给个赞吧。。。14652 条评论分享收藏感谢收起js对象属性方法完美总结_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
js对象属性方法完美总结
&&js对象属性方法完美总结
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩18页未读,
定制HR最喜欢的简历
你可能喜欢js 一个对象的属性名是一个变量怎么处理?_百度知道
js 一个对象的属性名是一个变量怎么处理?
var comment = function(){
var url = document.getElementById('commentscript').
var url = url.split('?');
var param = {} ;
if(url[1]){
var arrx = url[1].split('&');
for( var v in arrx){
var arrs = v.split('=');
求助啊,大神们?谢谢啦.arrs[0] = arrs[1] ; 这里的params 的arrs[0] 是一个变量,怎么处理,param如上。。
我有更好的答案
'abc'};var key=';console.log(obj[key]);/testKey&#39var obj={
采纳率:60%
来自团队:
=&#39、obj.age, age:18};var age1 =
for( var v in arrx){
var arrs = v.split('alert(age1 == age2);true所以,你的应该修改为if(url[1]){
var arrx = url[1].split('];);//&&#39.paramNvar age2 = stu[&age&quot,使用.访问2、obj[parameName],使用中括号属性名访问如:stu = {name:xm对象访问属性有两种方法1;)
本回答被提问者采纳
span style=&font-family: Arial,而是jquery,该如何修改呢: 代码如下;font-family.push({prop2;css' 也可以采用如下方式: 代码如下:&font-family:& for(var i in arr) {obj[i]=arr[i].如果有需求;span&gt,});object?代码如下:var arr=[]; } alert(obj.js); 就是那么简单!把对象obj当成一个数组来对待,它支持使用类似于下标形式的方法来把属性和属性值赋给对象.但是;&:&value1&}),当赋给该对象属性的时候可以采用以下方式代码如下; arr[&#39:object.push({&&span style=& for(var i in arr) {obj,对象依然是对象.i前面的被后面的覆盖掉;prop1&/jquery'; 这样通过object访问prop2会出现什么情况呢?比如; var obj={}; 读者不放猜一下alert会打印什么?当然是value1&lt: 复制代码 代码如下:var prop1 = &prop2&value2&quot,而访问span&gt.js), Helvetica, sans-&&css'&js']=&#39?因为obj现在只有一个属性i,而且通过两次循环; var obj={}; arr[&#39, sans-serif,&quot:&quot.prop1却是&value1&原因已经说过了,无论加不加引号,属性一律当成常量对待;]='oocss';]='oocss': Arial, Helvetica: object.prop1 = &value1&,也就是说,prop1只能作为常量被识别; arr['&jquery';; object.push({prop1:&&span style=&js']=&#39.push({prop1; 表达的含义都是一样的,比如:
代码如下.大家再猜一下,如果alert(obj.i)会打印什么?当然是 arr[&#39,属性也必须是一个变量才行,如上例代码,alert(obj.js)不是undefined.length是不存在的;}); 在这里prop1 作为属性名称, sans-object.prop2 = &value2&,为什么.i=arr[i]; } alert(obj: Arial, Helvetica.再举一个例子: 代码如下:var arr=[],即使它是个变量也没用,例如; 不用问,当然是undefined,也可以加上引号;value1&quot.prop2) &&#47:alert(&/span&&}),可以直接用:js的属性名可以使用变量举例:js对象object目标,需要动态添加属性,也就是说
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
var key1 = 'abc';
var data1 = 'DDDDDDDDDDD';
var key2 = 'def';
var data2 = 'GGGGGGGGGGG';
var rst = {
key1: data1,
key2: data2
console.log(rst);
key1: DDDDDDDDDDD,
key2: GGGGGGGGGGG
我想得到这样的结果
abc: DDDDDDDDDDD,
def: GGGGGGGGGGG
请问该如何实现?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
var key1 = 'abc';
var data1 = 'DDDDDDDDDDD';
var key2 = 'def';
var data2 = 'GGGGGGGGGGG';
var rst = {
[key1]: data1,
[key2]: data2
console.log(rst);
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
var key1 = 'abc';
var data1 = 'DDDDDDDDDDD';
var key2 = 'def';
var data2 = 'GGGGGGGGGGG';
var rst = {};
rst[key1] = data1;
rst[key2] = data2;
console.log(rst);
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
var rst={}
rst[key1]=data1
rst[key2]=data2
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。

我要回帖

更多关于 js 变量值做索引 的文章

 

随机推荐