JavaScript中的对象具有唯一的标识.通过表达式(如构造函数或文字)创建的每个对象都被视为与其他所有对象不同.
这背后的原因是什么?
{}==={}//output:false
Run Code Online (Sandbox Code Playgroud)
为什么他们被区别对待?是什么让他们彼此不同?
来自:http://www.2ality.com/2011/12/strict-equality-exemptions.html
JavaScript有两个运算符用于确定两个值是否相等:
- 严格相等运算符===只考虑具有相同类型的相等值.
- "正常"(或宽松)等式运算符==在比较严格相等之前尝试转换不同类型的值.
给初学者的建议是完全忘记==并始终使用===.
但是因为没有使用==运算符而导致它的原因是什么?它会导致安全风险吗?
但是使用typeof运算符我们可以确定结果将是一个字符串.然后==可以安全使用,因为我们可以确定它不会执行任何转换恶作剧:
if (typeof x == "function") {
...
}
Run Code Online (Sandbox Code Playgroud) 我发现Array对象Array.prototype都有length属性.我对使用该Array.length属性感到困惑.你如何使用它?
Console.log(Object.getOwnpropertyNames(Array));//As per Internet Explorer
Run Code Online (Sandbox Code Playgroud)
输出:
length,arguments,caller,prototype,isArray,
Run Code Online (Sandbox Code Playgroud)
Prototype并且isArray可以使用,但你如何使用该length属性?
众所周知:
i ++ - >首先使用i然后递增它的值
++ i - >先增加i,然后使用i的新值
但在下面的代码中有些不同
var n=5;
for(i=n;i>=1;--i)
{
console.log(i);//output:5 why?
for(j=1;j<=n;++j)
{
document.write(j);
}
document.write("\n");
}
Run Code Online (Sandbox Code Playgroud)
即使我们使用precrement运算符,为什么vaule在第一个循环上输出5?另外我们在完成innerLoop之后使用了新行但它没有显示出来.这背后的原因是什么呢?是不是每个循环上的becoz document.write()运行document.open()函数?如果是的话,其中上下文|| 条件将document.write运行document.open()函数?
Object.prototype.valueOf.call("abc")
{ '0': 'a'
, '1': 'b'
, '2': 'c'
}
Object.prototype.valueOf.call(new String("abc"))
{ '0': 'a'
, '1': 'b'
, '2': 'c'
}
Run Code Online (Sandbox Code Playgroud)
根据MDN,JavaScript调用valueOf方法将对象转换为原始值.如果对象没有原始值,则valueOf返回对象本身,显示为:
[object Object]
但是valueOf以不同的格式返回而不是返回原语.是
{ '0': 'a'
, '1': 'b'
, '2': 'c'
}不是它违反了定义?为什么它以那种格式返回.现在,这造成了混乱.如何知道如果为数组和其他调用Object.prototype.valueOf.call(array)将返回什么对象.
此外,为什么返回对象表单{}.valueOf()会显示,因为[].valueOf()记录时从方法返回 什么也不显示
请考虑以下代码:
function nepaliBuddha() {
var a = 20;
return function buddhaNepal() {
console.log(a);
}
}
var closure = nepaliBuddha();
closure(); // logs 20
Run Code Online (Sandbox Code Playgroud)
现在当我们调用closure输出时20.这证明了内部范围property([[scope]])被分配给定义它的内部函数或声明时声明.如果没有在声明中分配,则无法记录20,因为它在不同的上下文中被调用
调用closure()函数上下文的作用域链是在函数调用时创建的,它由当前上下文的激活对象或VO以及[[scope]]此函数的内部属性组成.
调用还会创建[[scope]]属性,这意味着内部范围属性是在声明时创建的,也不是在执行时创建的?
通常,定义表示[[scope]]属性是在运行时或函数调用时创建的,但这不是真的,因为[[scope]]属性已经在声明中分配.
我认为[[scope]]属性可能会在执行函数后得到更新,是吗?请明确[[scope]]内部属性的定义.如何以及何时在申报时或执行时或两次创建.
$("button").click(function () {
$("div").each(function (index, domEle) {
// domEle == this
$(domEle).css("backgroundColor", "yellow");
if($(this).is("#stop")) {
$("span").text("Stopped at div index #" + index);
return false;
}
});
});
Run Code Online (Sandbox Code Playgroud)
方法中return false需要做什么.each()?