在没有附加组件的Safari中,console.log
将在最后执行状态下显示对象,而不是在console.log
调用时的状态.
我必须克隆对象只是为了输出它console.log
来获取该行的对象状态.
例:
var test = {a: true}
console.log(test); // {a: false}
test.a = false;
console.log(test); // {a: false}
Run Code Online (Sandbox Code Playgroud) 我将从代码开始:
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控制台在评估我的阵列方面特别懒惰?
这段代码:
foo = [{id: 1},{id: 2},{id: 3},{id: 4}, {id: 5}, ];
console.log('foo1', foo, foo.length);
foo.splice(2, 1);
console.log('foo2', foo, foo.length);
Run Code Online (Sandbox Code Playgroud)
在Chrome中生成以下输出:
foo1
[Object, Object, Object, Object, Object] 5
0: Object
1: Object
2: Object
3: Object
length: 4
__proto__: Array[0]
5 (index):23
foo2
[Object, Object, Object, Object] 4
0: Object
1: Object
2: Object
3: Object
length: 4
__proto__: Array[0]
Run Code Online (Sandbox Code Playgroud)
小提琴:http://jsfiddle.net/2kpnV/
这是为什么?
我目前正在阅读Trevor Burnham的Async Javascript.到目前为止,这是一本很棒的书.
他谈到这个片段和console.log在Safari和Chrome控制台中是"异步"的.不幸的是我不能复制这个.这是代码:
var obj = {};
console.log(obj);
obj.foo = 'bar';
// my outcome: Object{}; 'bar';
// The book outcome: {foo:bar};
Run Code Online (Sandbox Code Playgroud)
如果这是异步,我会预期结果将成为书籍的结果.console.log()被放入事件队列中,直到执行完所有代码,然后运行它并具有bar属性.
虽然它正在同步运行但它似乎出现了.
我运行此代码错了吗?console.log实际上是异步吗?
今天我正在帮助同事调试一些代码,我注意到console.log()
谷歌Chrome中有一个奇怪的行为:
如果您:
创建一个嵌套数组(例如,[[345,"test"]])
使用将数组记录到控制台console.log()
.
修改其中一个内部数组值,然后console.log()
输出后面的值 - 而不是console.log()
执行时数组的值.
JavaScript:
var test = [[2345235345,"test"]]
console.log(test);
test[0][0] = 1111111;
// outputs: [[1111111,"test"]]
var testb = {};
testb.test = "test";
console.log(testb);
testb.test = "sdfgsdfg";
// outputs: {"testb":"test"}
var testc = ["test","test2"];
console.log(testc);
testc[0] = "sdxfsdf";
// outputs: ["test","test2"]
Run Code Online (Sandbox Code Playgroud)
在Firefox中不会发生此行为.
另外需要注意的是,如果我在Chrome调试器中逐行浏览他的代码,那么console.log()
会输出正确的值.
这个奇怪的现象是否有解释,还是仅仅是Google Chrome的错误?
编辑:
我已经缩小了重现不一致console.log()
行为的步骤:
如果您将此脚本添加到您的页面:
var greetings=['hi','bye'];
console.log(greetings);
setTimeout(function(){
greetings.push('goodbye');
},3000);
Run Code Online (Sandbox Code Playgroud)
并在Chrome 控制台窗口已打开的情况下在新窗口中打开它,然后console.log()
输出将与在控制台窗口关闭时加载页面的输出不同.这是一个证明这一点的JSFiddle. …
今天我用javascript遇到了一些非常奇怪的行为.我想我现在已经弄明白了,但我想知道我认为发生的事情是否真的发生了,或者是否还有其他一些魔法.所以这是我的代码:
var SomeObject = {};
SomeObject.foo = function(a, b) {
var baz = this.bar(a, b);
console.log(baz);
console.log(baz.left);
SomeObject.magicalStuff(baz);
};
SomeObject.bar = function(a, b) {
return {left: a-b, top: b-a};
};
SomeObject.magicalStuff = function(position) {
position.left = 0;
};
SomeObject.foo(100, 50);
Run Code Online (Sandbox Code Playgroud)
这个输出类似于(取决于浏览器):
> Object
50
Run Code Online (Sandbox Code Playgroud)
如果您展开"对象"(在Chrome,Safari或Firefox(Firebug)中,您得到的是:
> Object
left: 0
top: -50
Run Code Online (Sandbox Code Playgroud)
我希望:
> Object
left: 50
top: -50
Run Code Online (Sandbox Code Playgroud)
我的想法是,console.log()实际上只是"发布"对控制台的引用,一旦你点击"展开"符号就会被读取.但是那种打败console.log()作为调试工具的目的不是那样吗?我总是希望console.log()能够"快照"我传递给它的东西.看到实际的console.log()改变了那个console.log()调用的输出之后的声明,真是令人惊讶.
或者还有其他事情发生了吗?
编辑:我也想知道浏览器开发人员是否有合理的理由来实现这样的console.log(我猜有一个,否则它在主流浏览器中不一致).
在我的javascript中,我有两个元素.
我记录了两个元素,它显示了......
要素1.
要素2.
有问题.
当我console.log
的element
小号.children
他们显然还有些HtmlCollection
小号
您将在一分钟内理解以下内容:但奇怪的是,一个HtmlCollection为空(并且长度为0),但有3个元素(并且长度为3).
如果您console.log
为元素的孩子阅读下面的s,您将理解我在说什么...
元素1儿童和长度:
元素2儿童和长度:(搞砸了)
有谁知道这里发生了什么?
我如何解决这个问题,我需要通过HtmlCollection循环,但它不会让我因为长度是0 ...?
提前致谢!所有帮助赞赏.
我正在开发一个处理 xml 文件并返回接口数据结构的服务。
起初我以为服务已经正确返回了所有数据,但后来我意识到一些不清楚的事情,特别是当我要读取组件中的数据结构时。
这是我的服务:
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { AppConfig } from 'src/app/app.config';
import { forkJoin, Subscription } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class BibliographyParserService {
private editionUrls = AppConfig.evtSettings.files.editionUrls || [];
private bibliographicCitations: Array<BibliographicCitation> = [];
private subscriptions: Array<Subscription> = [];
constructor(
private http: HttpClient,
) {
}
private getHttpCallsOBSStream() {
return this.editionUrls.map((path) => this.http.get(path, { responseType: 'text'}));
}
public getBibliographicCitations(): Array<BibliographicCitation> {
const parser = new …
Run Code Online (Sandbox Code Playgroud) 我正在使用克隆一个对象数组slice()
但是当我将该克隆数组传递给另一个方法时,数组的内容正在丢失它们的引用并变为undefined
.
class Chooser
constructor: (@order, @items) ->
# do stuff
choose: ->
console.debug "Choosing", @order.size, "from", @items.slice()
@process(@order.size, @items.slice())
# do stuff
process: (count, items) ->
console.debug "count", count
console.debug "items", items
console.debug "@items", @items
# do recursive stuff that includes an items.shift()
Run Code Online (Sandbox Code Playgroud)
console.debug
正如预期的那样,第一个给了我:
Choosing 10 items from [Item, Item]
Run Code Online (Sandbox Code Playgroud)
在哪里Item
,Item
正是我所期待的.
但接下来的console.debug
行给了我
count 10
items [undefined x 2]
@items [Item, Item]
Run Code Online (Sandbox Code Playgroud)
据我所知,它@items.slice()
创建了一个浅层副本@items
,因此数组中的对象是对相同Item …
我对Javascript有点陌生,想解决一些问题,我已经阅读了一些有关提升的内容,并认为这可能是回答我问题的原因和答案,但是为什么日志中却注销了对我常量的最后一个分配?
const people = [
{
name: "Roger",
age: 29,
role: "Secret Agent"
},
{
name: "Jamie",
age: 35,
role: "Secret Agent"
}
]
console.log("people", people);
people[0].name = 'bob';
console.log("people", people);
Run Code Online (Sandbox Code Playgroud)
两个结果都显示bob,而不是Roger,然后是Bob。
如果有人可以解释为什么会发生,那就太好了。
正如标题所说,我想反转由 Javascript 中的对象组成的数组。
例子 : var x = [{"score":1},{"score":2},{"score":3}]
为此,我使用了 .reverse() 方法。
现在,假设我写了这段代码
console.log(x);
x.reverse();
console.log(x);
Run Code Online (Sandbox Code Playgroud)
我希望控制台以原始顺序显示数组,然后以相反的顺序显示。但是,它确实以相反的顺序显示了两个数组。
怎么来的 ?
我正在尝试在选项卡导航器之间传递一些参数。下面是我的程序的结构。粗体字为路线
应用程序(选项卡导航器):{主(堆栈)和过滤器(屏幕)}
主要(堆栈导航器):{ Home(屏幕)和MediaDetails(屏幕)}
我在屏幕上有一个与Filter关联的按钮,它具有onPress()函数。我传递了一些参数(但为了解决这个问题,我们只考虑参数) 。
this.props.navigation.navigate('Home', {
to: this.state.to,
}
Run Code Online (Sandbox Code Playgroud)
现在在与Home关联的屏幕中,我正在读取状态内的参数,如下所示:
state = {
to: this.props.route.params.to
}
Run Code Online (Sandbox Code Playgroud)
在App.js内部,我将to的初始值设置为“2020”,如下所示:
<Stack.Screen
name="Home"
component={HomeScreen}
initialParams={{
to: '2020'
}}
/>
Run Code Online (Sandbox Code Playgroud)
初始值确实设置为2020。我按下按钮。假设我设置为1900 。就在this.props.navigation.navigate执行之前,我console.log(this.state.to)该值,它确实更新为1900。但是,当屏幕更改为Home时,该值将恢复为2020(通过 console.log 观察到)
有人能指出这种怪异行为的原因吗?我已经尝试调试这个好几个小时了,但没有成功。React Navigation 5 也很新,所以在网上找不到类似的东西。任何帮助将不胜感激。感谢您一路以来的阅读。
编辑:问题已解决,完整代码已删除!
react-native react-navigation react-navigation-stack react-navigation-bottom-tab react-navigation-v5
当我使用第一个代码示例时,由于某种原因console.log()
给了我已处理的HighData变量。好像console.log()
在脚本的末尾。
console.log( "data", this.data['diagram'] );
var HighData = this.data['diagram'];
minSerieHeight = getMin( HighData[3] );
HighData[0] = mkSerie( HighData[0] );
HighData[1] = mkSerie( HighData[1] );
HighData[2] = mkSerie( HighData[2] );
HighData[3] = mkSerie( HighData[3] );
Run Code Online (Sandbox Code Playgroud)
更奇怪的是,当我使用它array.map()
(与上面的代码做完全相同的事情)时,它this.data['diagram']
按预期正确地返回了变量。
console.log( "data", this.data['diagram'] );
var HighData = this.data['diagram'];
minSerieHeight = getMin( HighData[ HighData.length - 1 ] );
HighData = HighData.map( e => {
return mkSerie( e );
});
Run Code Online (Sandbox Code Playgroud)
代码在mounted()
函数的Vue组件中。该getMin()
和mkSerie()
也都在mounted()
功能。
javascript ×11
arrays ×3
console ×3
console.log ×3
clone ×2
debugging ×2
logging ×2
object ×2
angular ×1
angular8 ×1
asynchronous ×1
coffeescript ×1
ecmascript-6 ×1
html ×1
react-native ×1
react-navigation-bottom-tab ×1
slice ×1
typescript ×1
vue.js ×1