我运行此代码并得到以下结果.我很想知道为什么[]更快?
console.time('using[]')
for(var i=0; i<200000; i++){var arr = []};
console.timeEnd('using[]')
console.time('using new')
for(var i=0; i<200000; i++){var arr = new Array};
console.timeEnd('using new')
Run Code Online (Sandbox Code Playgroud)
[]:299msnew:363ms感谢Raynos,这里是此代码的基准,以及一些更可行的方法来定义变量.

我正在学习JavaScript并且已经在Chrome控制台中进行了大量测试.即使我清除控制台,或者使用我在其他线程中看到的任何命令(localStorage.clear()),我指定的任何变量仍会显示出来.
例如,如果我做了类似的事情 localStorage.clear()
我清理并关闭控制台,重新打开它,然后寻找var name = "Bob";它的价值,它仍然存在name.
清除这些的最佳方法是什么?
在JavaScript中,var声明在全局对象上创建属性:
var x = 15;
console.log(window.x); // logs 15 in browser
console.log(global.x); // logs 15 in Node.js
Run Code Online (Sandbox Code Playgroud)
ES6引入let了具有块范围的声明的词法作用域.
let x = 15;
{
let x = 14;
}
console.log(x); // logs 15;
Run Code Online (Sandbox Code Playgroud)
但是,这些声明是否在全局对象上创建属性?
let x = 15;
// what is this supposed to log in the browser according to ES6?
console.log(window.x); // 15 in Firefox
console.log(global.x); // undefined in Node.js with flag
Run Code Online (Sandbox Code Playgroud) 进入一个有趣的问题.我正在努力尝试切换分配给变量的布尔值.它没有用,最终我尝试了这段代码.
var status = false;
console.log(!status);
Run Code Online (Sandbox Code Playgroud)
我希望它能true在控制台中提供,但我得到了false.我认为javascript会首先在括号内运行代码以找到它的值,然后在console.log中运行该值.你能解释一下为什么我没有true在控制台中获得价值吗?
让我们说我们有这个代码段:
var name = ["Apples","Oranges","Strawberries"];
console.log(name.length);
Run Code Online (Sandbox Code Playgroud)
这段代码产生了这个奇怪的结果27 !! 问题似乎是使用变量名称作为"名称",它看起来像一个保留关键字.
但任何人都可以解释为什么这种奇怪的行为?
是否可以在没有with(global)所有脚本默认具有的隐式上下文的情况下执行代码块?例如,在浏览器中,是否可以通过任何方式设置脚本,使诸如
const foo = location;
Run Code Online (Sandbox Code Playgroud)
抛出
未捕获ReferenceError:未定义位置
而不是访问window.location,何时location未先声明?缺少这一点,有没有办法使这种隐式引用导致某种警告?在编写代码时,它可能是错误的来源(见下文),因此有一种防范它的方法可能会很有用。
(当然,由于普通的作用域规则,可以使用const或let或在内部块中声明另一个具有相同名称的变量,以确保使用该变量名称引用的是新变量而不是global属性,但这不是一样。)
这可能类似于询问是否可以从实际 with语句中停止引用属性:
const obj = { prop: 'prop' };
with (obj) {
// how to make referencing "prop" from somewhere within this block throw a ReferenceError
}
Run Code Online (Sandbox Code Playgroud)
众所周知,with不应该首先使用它,但是不幸的是,当谈到时,我们似乎别无选择with(global),因为它偶尔会节省一些字符,但会浪费一些经常弹出的错误:1 2 3 4 5 6。例如:
const foo = location;
Run Code Online (Sandbox Code Playgroud)
(这里的问题:window.status是保留属性-分配给它时,它会将分配的表达式强制转换为字符串)
with阻止或禁止显式使用此类错误的原因相同,但with(global)即使在严格模式下,隐式错误也继续引起问题,因此找出解决方法将非常有用。
在Chrome开发者工具窗口中,我输入了:
> name = ["a", "b", "c"]
["a", "b", "c"]
Run Code Online (Sandbox Code Playgroud)
但是,name成了一个字符串:
> typeof name
"string"
> name
"a,b,c"
> name[1]
","
Run Code Online (Sandbox Code Playgroud)
对于其他变量名称显然不是这样!
> foo = ["a", "b", "c"]
["a", "b", "c"]
> typeof foo
"object"
> foo[1]
"b"
Run Code Online (Sandbox Code Playgroud)
并且name被定义为页面加载时的空字符串(据我所知,除了字符串之外不能成为任何其他内容).
那么,有什么用name?
如果我定义一个名为的JavaScript全局变量name,是否会隐藏window.name属性?
我在Facebook JavaScript身份验证API的上下文中提出这个问题,因为我注意到具有该名称的全局会破坏它,并且因为我看到它window.name在他们的代码中使用.
我的编辑器 (VS Code) 显示我的变量名已被弃用。从第 2 行开始,它有一个斜线。你能帮我吗?
let name = 'Mark';
name = 5;
console.log(name);
Run Code Online (Sandbox Code Playgroud)