JavaScript。一个奇怪的赋值语句

标签 javascript arrays

var test=(a=1,[b=2]["sort"])();

此代码在 Firefox 中有效,结果为 test=window(窗口对象),

它是有效的 JavaScript 代码吗? (我没能在 JavaScript 引用资料中找到它)

最佳答案

它是“有效的”,但在我看来完全是病态的。从 var 的名称来看,我猜想有人在某个时候想出了这个作为功能测试,但没有添加注释来解释原因。

这就是它正在做的事情。首先,这两个赋值将解析为赋值,所以我们可以替换它们(它们确实赋值变量,这是一个副作用,但这不影响这个表达式的评估):

var test=(1, [2]["sort"])();

["sort"] 就是 .sort:

var test=(1, [2].sort)();

逗号运算符将返回括号中的最后一个值,因此我们可以去掉 1:

var test=([2].sort)();

现在括号中的部分正在创建一个数组,其中包含数字 2,并找到该数组的 sort 方法。然后它调用该方法,但由于第一组括号,它在没有指定上下文的情况下调用它。

在非严格模式下,没有上下文调用的函数将 window 作为它的 this

因此它尝试对 window 进行排序并返回结果,如您所见,它是 window

在 Firebug 和 Chrome 中的 JS 控制台的严格模式下,没有上下文调用的函数将 undefined 作为它们的 this,这意味着这个例子会抛出错误,如上面提到的 mplungjan。 https://developer.mozilla.org/en/JavaScript/Strict_mode

关于JavaScript。一个奇怪的赋值语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8413071/

相关文章:

javascript - Mongoose - Model.deleteOne() 正在删除整个集合而不是单个文档

javascript - 在刷新时保留下拉选择

javascript - javascript中按子数组属性值对对象数组进行排序

python - 如何将不同的元素添加到列表中的列表中? python 3

c - C99 中的灵活数组

JavaScript 语法疯狂 : pointer to eval function is not the eval function?

javascript - 10次​​退出后窗口关闭事件的反馈调查模式,无论相同或不同用户

javascript - ASP 更新面板中的引导模式对话框阻止了 tinyMCE 插件中的输入焦点

c++ - 总结一串数字输入的最佳方法

javascript - 使用 array.map 返回响应三元运算符