CodeMash 2012的"Wat"谈话基本上指出了Ruby和JavaScript的一些奇怪的怪癖.
我在http://jsfiddle.net/fe479/9/上做了一个JSFiddle的结果.
下面列出了JavaScript特有的行为(我不知道Ruby).
我在JSFiddle中发现我的一些结果与视频中的结果不一致,我不知道为什么.但是,我很想知道JavaScript在每种情况下如何处理幕后工作.
Empty Array + Empty Array
[] + []
result:
<Empty String>
Run Code Online (Sandbox Code Playgroud)
+在JavaScript中使用数组时,我对运算符非常好奇.这与视频的结果相匹配.
Empty Array + Object
[] + {}
result:
[Object]
Run Code Online (Sandbox Code Playgroud)
这与视频的结果相匹配.这里发生了什么?为什么这是一个对象.什么是+运营商吗?
Object + Empty Array
{} + []
result
[Object]
Run Code Online (Sandbox Code Playgroud)
这与视频不符.该视频表明结果是0,而我得到[对象].
Object + Object
{} + {}
result:
[Object][Object]
Run Code Online (Sandbox Code Playgroud)
这与视频不匹配,输出变量如何导致两个对象?也许我的JSFiddle错了.
Array(16).join("wat" - 1)
result:
NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
Run Code Online (Sandbox Code Playgroud)
做wat + 1导致wat1wat1wat1wat1......
我怀疑这只是简单的行为,试图从字符串中减去一个数字导致NaN.
为什么{} || []无效?
$ echo '[] || {}' | node # this works
$ echo '{} || []' | node # but this doesn't
[stdin]:1
{} || []
^^
SyntaxError: Unexpected token ||
at createScript (vm.js:80:10)
at Object.runInThisContext (vm.js:139:10)
at Object.<anonymous> ([stdin]-wrapper:6:22)
at Module._compile (module.js:652:30)
at evalScript (bootstrap_node.js:466:27)
at Socket.<anonymous> (bootstrap_node.js:237:15)
at emitNone (events.js:111:20)
at Socket.emit (events.js:208:7)
at endReadableNT (_stream_readable.js:1064:12)
at _combinedTickCallback (internal/process/next_tick.js:138:11)
$ echo '({}) || []' | node # unless you do this
Run Code Online (Sandbox Code Playgroud) 我将以下内容放入浏览器控制台:
0 === {} // false
{} === 0 // SyntaxError: expected expression, got '==='
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
为什么当我输入{} === null控制台时它会抛出
SyntaxError:意外的令牌===
null === {} 按预期给我假.
我目前正在分析Javascript语言.看起来您可以将许多概念分组为一个名为expression的基类型.甚至函数参数和定义也适合该组,以及字符串,数字和数学表达式.唯一不合逻辑的例外是在无意义的上下文中的大括号对象表示法.
由于函数由多个表达式组成,因此以下代码有效:
function valid(){
/\W/;
"ahll";
var alpha;
alpha;
alpha={"first": 90, "second": 80};
alpha;
0, {"first": 90, "second": 80};
[1,2,3];
alpha;
2+3;
new RegExp("/\W/");
return true;
}
Run Code Online (Sandbox Code Playgroud)
根据意图,以下代码也应该有效,但第二行会出现"missing; before statement"语法错误:
function invalid(){
{"first": 90, "second": 80};
return true;
}
Run Code Online (Sandbox Code Playgroud)
在接受表达式的每个其他情况下都接受大括号对象表示法,除了这些允许使用大括号代码块的情况.
上面提到的语法错误是由javascript的实现还是规范引起的?
这种无意义的表达是否有更精确的名称?
我正在写一个关于 javascript thruthiness 的小游戏,我发现了一些奇怪的东西。
eval('{}=={}') // error
{}=={} // false in the console but is an error in a source file
eval('[]==[]') // no error => false
eval('{}') // no error => undefined
eval('({})') // no error => Object
eval('[]') // no error => Array
Run Code Online (Sandbox Code Playgroud)
为什么 eval('{}=={}') 是一个错误,为什么 eval 包含 {} 的东西如此不一致?
可能重复:
为什么{}!=({})在JavaScript中?
我今天试了一下它今天把它扔给了我SyntaxError它让我很奇怪; 这有什么问题?
{} === {}
{} == {}
Run Code Online (Sandbox Code Playgroud)
怎么了?
在Chrome控制台中输入:
{}[true] // [true] (object)
!!{}[true] // false (boolean)
Run Code Online (Sandbox Code Playgroud)
当{} [true]是什么时,为什么!! {} [true]不正确?
在JavaScript中,typeof {}返回"object",而评估{}返回undefined.为什么是这样?
var a;
a; //undefined
{}; //undefined
typeof a === typeof {}; //false
Run Code Online (Sandbox Code Playgroud)