我将从代码开始:
var s = ["hi"];
console.log(s);
s[0] = "bye";
console.log(s);
Run Code Online (Sandbox Code Playgroud)
简单吧?对此,Firebug说:
["hi"]
["bye"]
Run Code Online (Sandbox Code Playgroud)
很棒,但Chrome的JavaScript控制台(7.0.517.41 beta)说:
["bye"]
["bye"]
Run Code Online (Sandbox Code Playgroud)
我做错了什么,或者Chrome的JavaScript控制台在评估我的阵列方面特别懒惰?
我对JavaScript或Chrome控制台的行为感到非常困惑.有人可以帮我理解吗?
基本上我有以下JavaScript代码,而不是嵌套在任何函数或其他范围内:
var initial_array = [];
function initialiseArray() {
initial_array = [2, 9, 8, 6, 0, 2, 1];
}
function copyToNewArray() {
var copied_array = [];
console.log("COPIED 1", copied_array);
for (var i = 0; i < initial_array.length; i++) {
var copy = initial_array[i];
copied_array.push(copy);
}
console.log("COPIED 2", copied_array);
}
initialiseArray();
copyToNewArray();
Run Code Online (Sandbox Code Playgroud)
我希望COPIED 1打印[]- 因为变量尚未分配 - 而是打印[2, 9, 8, 6, 0, 2, 1]- 即分配后的值.
为什么?
顺便说一句,如果用8-11替换第8行initial_array = copied_array,那么RESULTS 1确实打印为[].这与使用有关 …
我有以下代码:
console.log("start");
for(var i = 0; i < array.length; i++){
console.log(i + " = " + array[i]);
}
console.log(array);
console.log("end");
Run Code Online (Sandbox Code Playgroud)
这给了我以下输出:
[16:34:41.171] start
[16:34:41.171] 0 = 0
[16:34:41.172] 1 = 168
[16:34:41.172] 2 = 171
[16:34:41.172] [0, 168, 171, 139]
[16:34:41.172] end
Run Code Online (Sandbox Code Playgroud)
也就是说,它在迭代数组时不显示139元素,但是console.log在输出整个数组时会打印它.为什么?(< - 问题)
我稍后修改了数组,是不是以某种方式延迟了console.log,直到我更改了数组?注意,改变语句的顺序,consoel.log(array)直接放在开头不会改变结果(仍然是不同的输出).
我使用的是Firefox 20.0
我有理由相信console.log并且JSON.stringify可以产生相同对象的不一致视图,即使它是以直接的方式创建的(参见注释).
情况
在谷歌浏览器开发者工具和Firebug的,我有一个对象obj,其console.log打印出来{ players: {0: ...}, ...},而JSON.stringify报道{ players: {}, ...}.obj.players是{}在这两种功能,所以它似乎console.log是罪魁祸首.它可能在某种程度上是异步/非确定性的吗?
补充说明
我担心我无法提供更多的上下文,因为代码很长而且对于客户来说,但我可以尝试,如果有一些东西可以帮助深究这一点.目前,我被迫远离console.log检查.
知道通过手动设置属性仅仅从对象文字形成对象可能是有用的,例如,obj.players = {}; obj.players[0] = ....
码
我的意思的样本可以在http://jsfiddle.net/9dcJP/上观察到.
我一直在使用Google Chrome version 28.0.1500.95 m控制台测试一些JavaScript,并希望更多地了解它的工作原理:看看下面的代码:
var obj = {
a: 99,
f: function() { }
}
console.log(obj.a)
console.log(obj.z)
console.log(obj)
o.z = 100;
Run Code Online (Sandbox Code Playgroud)
这会输出以下结果:
99
undefined
Object {a: 99, f: function}
a: 99
f: function () { }
z: 100
__proto__: Object
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么z直到日志之后才宣布结果?
我假设这是控制台如何工作的东西,而不是JavaScript中的一些奇怪的范围规则,我不知道?
谁能告诉我这里发生了什么事?
两者有什么区别:
\nPromise.all([1,2]) //Promise {<fulfilled>: Array(2)}\nRun Code Online (Sandbox Code Playgroud)\n和
\nlet p1 = Promise.all([1,2]);\nconsole.log(p1) //Promise\xc2\xa0{<pending>}\nRun Code Online (Sandbox Code Playgroud)\n为什么控制台显示不同的结果?
\n我只是单纯地使用JSON.stringify({"a": "123"})到stringify一个json
在chrome中,"分号将不会被转义,它将回显
JSON.stringify({"a": "123"})
"{"a":"123"}"
Run Code Online (Sandbox Code Playgroud)
但是如果我在野生动物园中使用相同的代码,"分号将被转义,就像这样
JSON.stringify({"a": "123"})
"{\"a\":\"123\"}"
Run Code Online (Sandbox Code Playgroud)
我想知道为什么chrome和safari产生不同结果的原因