javascript小测试,弄清楚这些题目可以帮助你更好的理解javascript语言的一些特性,比如运算符的优先级、作用于链、强制数据转换、函数表达式等。
点击这里有这些题的运算结果。
先看题:
example 1
var num1 = 5,
num2 = 10,
result = num1+++num2;
rusult 的值是多少,num1和num2 的值分别是多少?
example 2
var x = 5,
o = {
x: 10,
doIt: function doIt(){
var x = 20;
setTimeout(function(){
alert(this.x);
}, 10);
}
};
o.doIt();
example 3
var num1 = "10",
num2 = "9";
num1 < num2 的值是?
+num1 < num2 的值是?
num1 + num2 的值是?
+num1 + num2 的值是?
example 4
var message = "Hello world!";
message.substring(1, 4)值是?
message.substr(1,4)值是?
example 5
var o = {
x: 8,
valueOf: function(){
return this.x + 2;
},
toString: function(){
return this.x.toString();
}
},
result = o < "9";
alert(o);
result 的结果是?
alert 打印的结果是?
example 6
(function(){
return typeof arguments;
})();
example 7
var f = function g(){ return 23; };
typeof g();
example 8
(function(x){
delete x;
return x;
})(1);
example 9
var y = 1, x = y = typeof x;
x的值是?
example 10
(function f(f){
return typeof f();
})(function(){ return 1; });
解答:
example 1
result 的值是15,num1为6,num2为10
下表按从最高到最低的优先级列出JavaScript运算符。具有相同优先级的运算符按从左至右的顺序求值。
| 运算符 |
描述 |
| . [] () |
字段访问、数组下标、函数调用以及表达式分组 |
| ++ — – ~ ! delete new typeof void |
一元运算符、返回数据类型、对象创建、未定义值 |
| * / % |
乘法、除法、取模 |
| + – + |
加法、减法、字符串连接 |
| << >> >>> |
移位 |
| < <= > >= instanceof |
小于、小于等于、大于、大于等于、instanceof |
| == != === !== |
等于、不等于、严格相等、非严格相等 |
| & |
按位与 |
| ^ |
按位异或 |
| | |
按位或 |
| && |
逻辑与 |
| || |
逻辑或 |
| ?: |
条件 |
| = oP= |
赋值、运算赋值 |
| , |
多重求值 |
很明显,”++”为一元运算符,优先级要高于”+”加法运算符。所以,result=num1+++num2 等价于 result = (num1++)+num2,又因为++运算符后置,后缀式运算符是在计算过包含它们的表达式后才进行增量或减量运算的。所以result 的值是15。
example 2
该题的结果是5.涉及到了作用域链(JavaScript scope)的知识,setTimeout 中的函数的的scope会放入global scope, “this”指向window,所以会找到全局变量x。
example 3
字符串比较大小,会把字符转换为ASCII 码来对比,是逐个字符比较,如果相等,这比较下一个字符,否则返回比较结果。“10”的第一个字符‘1’比‘9’的ASCII要小。所以,”10″<”9″会返回 true.
字符串前面的”+”运算符会把字符串转换为数字。当一个是字符串变量,一个是数字比价大小时.这里还包括字符串变量是数字还是字母.当字符串是数字时,ECMAscript规定自动转换为数字类型,当是字母时,转换为数字时会转换为NaN,当NaN和数字比较时不论大小都返回false。
example 4
substring(index1,index2)的第二个参数是截取结束字符的index值。
substr(index1,length) 的第二个参数是截取的字符串的长度。
注:substr() 在ECMA中已建议弃用
example 5
在javascript中,object的prototype中已有两个方法valueOf和toString,前者在获取对象的值时自动调用,后 者在转换为字符串的时候自动调用。该题中对象o重写了这两个方法,所以result=o<”9″ 调用了o的valueOf方法,转换为result =10<”9″,根据第二题,9自动会转换为数字,所以返回为false.而在执行alert(o)时,会自动调用toString方法,打印出来 是8
example 6
标识符arguments本质上是个局部变量,在每个函数中都会被自动声明并被初始化,是一个特殊的数组,继承自object,typeof 打印出来为“object”.
example 7
在IE下返回为number,在FF下报“ReferenceError: g is not defined”的异常。具体情况还未知,有知道的告诉我。
example 8
通过var声明的变量和通过function声明的函数拥有DontDelete特性,无法被删除.详细可参考这篇文章。
example 9
x值为undefine(而不是报异常),JavaScript引擎会优先解析var变量和function定义。在预解析完成后,才会执行代码。 详见lifesinger的《JavaScript运行机制浅探》
example 10
number,注意f后面那个括号。