假设我写的0.5是0.-5在意想不到的方式,但它仍然可以运行.是什么0.在0.-5这样做,它可以仍然可以运行,计算结果为-5?
我也试过alert(0.-5+1)打印-4,JavaScript忽略0.了0.-5吗?
我试图调用文字函数,但我得到了奇怪的行为.
考虑这个返回的代码true.
23 === (23)
Run Code Online (Sandbox Code Playgroud)
当我写作尝试以下.
(23).toFixed(2)
Run Code Online (Sandbox Code Playgroud)
我得到了预期的结果_23.00_但是当我尝试时23.toFixed(2)我得到了这个错误.
SyntaxError:意外的标记ILLEGAL
JavaScript如何评估无法理解的表达式以及为什么会出现此错误?
如果查看ECMAScript 3规范,您将看到原始值类型Null和Undefined没有伴随Null和Undefined对象.
>> Null
ReferenceError: Null is not defined
Run Code Online (Sandbox Code Playgroud)
其他原始值类型Number,String和Boolean类型都有伴随的Number,String和Boolean对象,您可以从全局范围引用它们.
>>Number
function Number() { [native code] }
>>Boolean
function Boolean() { [native code] }
Run Code Online (Sandbox Code Playgroud)
这些原始值类型的目的是提供诸如toString和valueOf它们各自的原始值类型的方法:
>>var n = 1;
>>n.toString();
"1"
Run Code Online (Sandbox Code Playgroud)
是相同的
>>var n = 1;
>>Number.prototype.toString.call(n);
"1"
Run Code Online (Sandbox Code Playgroud)
布尔值和字符串也是这样工作的:
>>var b = true;
>>b.toString();
"true"
>>Boolean.prototype.toString.call(b);
"true"
Run Code Online (Sandbox Code Playgroud)
当您尝试混合类型时,您可以看到原始值对象正在使用其伴随对象的方法:
>>Boolean.prototype.toString.call(n);
TypeError: Boolean.prototype.toString is not generic
>>Number.prototype.toString.call(b)
TypeError: Number.prototype.toString is not generic
Run Code Online (Sandbox Code Playgroud)
有趣的是,对于布尔和字符串文字类型,您可以直接从文字中调用这些方法:
>>true.toString();
"true"
>>Boolean.prototype.toString.call(true)
"true"
>>"moo".toString();
"moo"
>>String.prototype.toString.call("moo")
"moo"
Run Code Online (Sandbox Code Playgroud)
原始值为null和undefined,因为它们没有附带的Null和Undefined对象不能执行以下操作:
>>Null
ReferenceError: Null is not defined …Run Code Online (Sandbox Code Playgroud) 我正在阅读Douglas Crockford的JavaScript:The Good Parts,我正处于定义淡入淡出功能的地步.部分代码归结为:
var level = 1;
var hex = level.toString(16);
Run Code Online (Sandbox Code Playgroud)
所以我在浏览器的控制台中运行它以查看我得到的内容....
var level = 1;
level.toString(16);
Run Code Online (Sandbox Code Playgroud)
嘿,它返回" 1"...... Fabuloso!Wunderbar酒吧!
然后,为了厚颜无耻,我试着看看我得到了什么......
1.toString(16);
Run Code Online (Sandbox Code Playgroud)
我明白了
SyntaxError:意外的标记ILLEGAL
什么是什么?如果level变量等于1,并且在该级别上运行此方法工作正常,那么为什么不在实际的数字1上运行此方法呢?我尝试了一种与该toPrecision()方法类似的实验,并且在两种情况下均可正常工作.这是什么问题?这是JavaScript实现中的另一个固有缺陷,还是我错过了什么?我正在Google Chrome中测试.
相关:Stack Overflow问题为什么数字文字不能访问Number方法?.
在Ruby中,您可以这样做:
3.times { print "Ho! " } # => Ho! Ho! Ho!
Run Code Online (Sandbox Code Playgroud)
我尝试用JavaScript做到这一点:
Number.prototype.times = function(fn) {
for (var i = 0; i < this; i++) {
fn();
}
}
Run Code Online (Sandbox Code Playgroud)
这有效:
(3).times(function() { console.log("hi"); });
Run Code Online (Sandbox Code Playgroud)
事实并非如此
3.times(function() { console.log("hi"); });
Run Code Online (Sandbox Code Playgroud)
Chrome给了我一个语法错误:"意外的令牌ILLEGAL".为什么?
自从我开始使用JS以来,我认为在数字文字上调用函数的唯一方法是通过用parens包装它来将它放在表达式位置,如下所示:
1.toString();
// SyntaxError: identifier starts immediately after numeric literal
(1).toString();
// "1"
Run Code Online (Sandbox Code Playgroud)
今天,我想到尝试这个:
0.1.toString();
// "0.1"
Run Code Online (Sandbox Code Playgroud)
为什么这样做?指向官方规范的指针会很棒.
编辑歧义是我的第一个想法,但随后决定1.toString()两者都没有歧义.这比我初想的要深,但我仍然认为我是对的.原因如下:
属性名称可以以数字开头
var obj = { "1" : 1, "2" : 2 };
Run Code Online (Sandbox Code Playgroud)
以数字开头的属性名称只能用方括号引用
obj.1;
// SyntaxError: Unexpected token ILLEGAL
obj['1'];
// 1
Run Code Online (Sandbox Code Playgroud)
也:
1['toString']();
// '1'
Run Code Online (Sandbox Code Playgroud)
因此,1.任何非数字后跟始终是方法调用或属性访问,永远不是十进制数.同样,1.后跟任何数字将始终是十进制数字,从不进行方法调用或属性访问.
让我们看下面的例子:
Q1:为什么0这里输出?这是什么意思?
var a = 7;
console.log(a.constructor()); // prints 0 (Why?)Run Code Online (Sandbox Code Playgroud)
问题2:何时typeof a和typeof 7两者都是数字,为什么a.constructor()运行而7.constructor()没有?
var a = 7;
var bool = typeof a === typeof 7;
console.log(a.constructor()); // 0
console.log((++a).constructor()); // 0
console.log(7.constructor()); // SyntaxError: Invalid or unexpected token
console.log(++a.constructor()); // ReferenceError: Invalid left-hand side expression in prefix operationRun Code Online (Sandbox Code Playgroud)
当我在十进制数字文字上调用toFixed()方法时,如下所示:
var a = 67.678.toFixed(2);
console.log(a);
Run Code Online (Sandbox Code Playgroud)
结果有效并返回67.68
但是,如果我在整数上调用该方法 - 我会收到错误
var b = 67.toFixed(2);
console.log(b); // causes ERROR
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
注意:
如果我将整数保存到变量 - toFixed()方法确实有效.
var c = 67;
c = c.toFixed(2);
console.log(c); // returns 67.00
Run Code Online (Sandbox Code Playgroud)
看到这个jsBin
引擎盖下发生了什么?
可能重复:
为什么我不能使用单个点访问整数的属性?
我正在阅读一篇文章,并遇到了javascript toFixed方法的奇怪行为.我不明白最后一句话的原因.有人可以解释一下吗?
(42).toFixed(2);//"42.00" 好的
42.toFixed(2); // SyntaxError:标识符在数字文字后立即开始
42..toFixed(2);//"42.00" 这真的很奇怪
(1)和1之间有什么区别.
1.toString() //Will throw error
1.toFixed(1) //Will throw error
(1).toString() // output "1"
(1).toFixed(1) // output 1.0
Run Code Online (Sandbox Code Playgroud) 我猜的JavaScript将解析(2).valueOf()到new Number(2).valueOf(),但为什么它不是第一个?
根据运算符优先级,分组运算符的优先级应高于成员访问权限https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
那么为什么(2)不首先进行评估2而不是被解析为屈服new Number(2)?
我知道1不是对象,但是当我键入时1..toString(),它在控制台中返回"1".这是为什么?
