js中属性点.和中括号[]的关系。
本来这里说的是 js 执行一个字符串形式函数的方法。
但是呢看到一个 window['test'] ,居然一下子转不过弯来。这就尴尬了。
不是说好了 [] 和 . 其他都是 “什么的什么” 关系吗?如 'window.onload' ,表示 window 的加载事件。
使用 function fn(){} 定义了一个函数,和使用 var fn=function(){} 相同的呢。 那这里的 fn 就相当于 window 下的变量咯。所以是 window['fn'] 。
那问题又来了,为什么是加字符串的 ['fn'] 而不是不加字符串的 [fn] 呢? 不加不报错,返回 undefined 。似乎是一个求定义的变量?那 var fn=function(){} 不是定义了么?
1. 中括号运算符总是能代替点运算符。但点运算符却不一定能全部代替中括号运算符。
2. 中括号运算符可以用字符串变量的内容作为属性名。点运算符不能。
看来这里的“可以用”得改为“需要用”了。
var a=0;
//undefined
a
//0
window.a
//0
window[a]
//Window {…}
window['a']
//0
3. 中括号运算符可以用纯数字为属性名。点运算符不能。
这个倒是经常用,使用下标时用。如 arr[0] 。这里不引号 arr[0] 就和加引号的 arr['0'] 相同了。
4. 中括号运算符可以用js的关键字和保留字作为属性名。点运算符不能。
window[window]=1
//1
window.window=2
//2
window[window]
//1
window.window
//Window {}
window[window]
//1 //为什么 window.window=2 都有返回值2了,但 再执行 window.window 时却没有成功?
//另外 window[window] 输入的值还是 1 ,也就是也没有被第一次的 window.window=2 改变。
//请问 window.window=2 去哪了?
下面把本来的 js 执行字符串形式的函数贴一下。下面的 eval 方法好像很多人不喜欢用,据说是因为安全问题。如果是把 JSON 字符串转为对象什么的, JSON.parse(''{"left":100}'') 是经常用的。
<SCRIPT LANGUAGE="JavaScript">
function test(str){
alert(str);
}
window['test']('aaaaaaaaaaaaaaaaaaaaa');
</SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
function test(str){
alert(str);
}
eval('test("aaaaaaaaaaaaaaaaaaa")');
</SCRIPT>
再上两个例子。
function func(a){//定义一个待参数的函数
alert(a);
}
eval('func()');//调用函数不传入参数
eval('func("bcd")');//调用函数,传入参数
var bb = 'function play(){alert("getplay");}';
var ss = bb;
var ex = {getplay:eval("("+ss+")")};
ex.getplay();
js中属性点.和中括号[]的关系。的更多相关文章
- js中对象与函数的关系
首先什么是对象?根据W3C上面的解释JS中所有事物都是对象,对象是拥有属性和方法的数据,由此可以看出基本值类型不是对象(number.string.Boolean.Undefined),剩下的引用类型 ...
- JS中ptototype和__proto__的关系
学到原型的时候感觉头都大了/(ㄒoㄒ)/~~ 尤其是ptototype和__proto__ 傻傻分不清 通过多番查找资料,根据自己的理解,总结如下: 一.构造函数: 构造函数:通过new关键字可以用 ...
- js中prototype与__proto__的关系详解
一.构造函数: 构造函数:通过new关键字可以用来创建特定类型的对象的函数.比如像Object和Array,两者属于内置的原生的构造函数,在运行时会自动的出现在执行环境中,可以直接使用.如下: var ...
- js中DOM 节点的一些操作方法
什么是DOM DOM:文档对象模型.DOM 为文档提供了结构化表示,并定义了如何通过脚本来访问文档结构.目的其实就是为了能让js操作html元素而制定的一个规范. DOM就是由节点组成的. 解析过程 ...
- JS中的箭头函数与this
转载自:https://juejin.im/post/5aa1eb056fb9a028b77a66fd#heading-1 JavaScript在ES6语法中新增了箭头函数,相较于传统函数,箭头函数不 ...
- 深入理解JS中的对象(一)
目录 一切皆是对象吗? 对象 原型与原型链 构造函数 参考 1.一切皆是对象吗? 首先,"在 JavaScript 中,一切皆是对象"这种表述是不完全正确的. JavaScript ...
- Js中Prototype、__proto__、Constructor、Object、Function关系介绍
一. Prototype.__proto__与Object.Function关系介绍 Function.Object:都是Js自带的函数对象.prototype,每一个函数对象都有一个显式的proto ...
- js 中中括号,大括号使用详解
一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数.如:var LangShen = {"Name":"Langshen",&quo ...
- js中__proto__和prototype的区别和关系?
_proto__(隐式原型)与prototype(显式原型)1.是什么 显式原型 explicit prototype property: 每一个函数在创建之后都会拥有一个名为prototype的属性 ...
随机推荐
- 使用yaml+groovy实现Java代码可配置化
背景与目标 在使用函数接口和枚举实现配置式编程(Java与Scala实现),使用了函数接口和枚举实现了配置式编程.读者可先阅读此文,再来阅读本文. 有时,需要将一些业务逻辑,使用配置化的方式抽离出来, ...
- GUI界面修饰
function varargout = GUI20(varargin) % GUI20 MATLAB code for GUI20.fig % GUI20, by itself, creates a ...
- element ui里dialog关闭后清除验证条件
//vue <!--添加用户dialog begin--> <el-dialog title="编辑用户" :visible.sync="dialogF ...
- <转>jmeter(五)JDBC Request
本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...
- ajax处理文件下载
ajax中处理文件下载,可能大数会遇到我和一样的问题,什么问题呢?就是下载程序执行了,但是浏览器没有任何下载操作,这是为什么呢? 那是因为response原因,一般请求浏览器是会处理服务器输出的res ...
- POSIX rename语义
POSIX对rename行为的定义如下(http://www.opengroup.org/onlinepubs/009695399/functions/rename.html): 将一个文件重命名为一 ...
- flask框架----flask-script组件
Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任 ...
- Tomcat配置Manager管理员
修改文件: D:\MyDev\Tomcat\apache-tomcat-7.0.68\conf\tomcat-users.xml 配置内容: <role rolename="mana ...
- php 查找字符串里面中文字符第一次出现的位置,并插入字符串
//查找字符串里面中文字符第一次出现的位置,并插入字符串 function find_first_chinese_insert($str,$insert_str){ $count = mb_strle ...
- k8s build new API
apiserver-builder git hub api conventions storage api arch step by step, we can follow it. api con ...