- 你会用typeof f*ck = ‘object’来判断是否是对象吗?你有何高见?显然如果f*ck是个数组的话,typeof也会返回true,应该用的是
object.prototype.tostring.call(f*ck) === 'object Object'; //return true
object.prototype.tostring.call(f*ck) === 'object Array'; //return false
- 请你解释一下以下两个函数返回值的区别;
function foo1()
{
return {
bar: "hello"
};
}
function foo2()
{
return
{
bar: "hello"
};
}
重点;JS 解析器会根据能否正常编译来决定是否自动填充分号: 第二个函数的return让js解析器认为可以结束了就自动填充了分号:
所以反回了undefined
function foo2()
{
return;
{
bar: "hello"
};
}
- 你来说说下面程序的执行顺序?
(function() {
console.log(1);
setTimeout(function(){console.log(2)}, 1000);
setTimeout(function(){console.log(3)}, 0);
console.log(4);
})();
settimeout()是会在执行队列后面的,所以一定是先执行完iife,再计时,也就是: 1 4 3 2
- 如何实现以下的输出?
console.log(sum(2,3) // 5
console.log(sum(2)(3)) //5
function sum (){
var first = arguments[0];
if(arguments.length === 2){
return arguments[0]+arguments[1];
}else{
return function(secound){
return first + secound;
}
}
};
- 如何实现以下的输出?
var arr1 = "john".split(''); j o h n
var arr2 = arr1.reverse(); n h o j
var arr3 = "jones".split(''); j o n e s
arr2.push(arr3);
console.log("array 1: length=" + arr1.length + " last=" + arr1.slice(-1));
console.log("array 2: length=" + arr2.length + " last=" + arr2.slice(-1));
重点:数组的 reverse()是返回数组本身的,这里的arr1 ==== arr2 ;
输出:
array 1: length=5 last=j,o,n,e,s
array 2: length=5 last=j,o,n,e,s
- 以下输出什么?
console.log(2 + 1 + '3'); / /‘33’
console.log('3' + 2 + 1); //'321'
console.log(+'1' + '1' + '2'); //112 //
数字字符串之前存在数字中的正负号(+/-)时,会被转换成数字
你可以理解为:+’1’运算符与字符串靠近就相当于+1 === 1;
console.log( "A" - "B" + "2");
console.log( "A" - "B" + 2);
你可以理解为:’a’ - ‘a’ = NAN,但NAN+”就变成了 NAN2
typeof(NAN)其实是’number’,且NAN !== NAN;所以NAN+2应该还是NAN;
- 小面的list很大,怎么才能防止溢出?
var list = readHugeList();
var nextListItem = function() {
var item = list.pop();
if (item) {
// process the list item...
nextListItem();
}
};
改进:加一个计数器,因为计数器是放在执行队列后面的,只要是运行完了这个nextListItem,才会执行计数器的回调函数,所以肯定不
会溢出:运行完了就会出栈,再进来一个回调函数,理论上,是永远只有一层,不怕他多大嘿嘿嘿~
var list = readHugeList();
var nextListItem = function() {
var item = list.pop();
if (item) {
// process the list item...
setTimeout( nextListItem, 0);
}
};
- 以下代码输出的是什么?
console.log("0 || 1 = "+(0 || 1));
console.log("1 || 2 = "+(1 || 2));
console.log("0 && 1 = "+(0 && 1));
console.log("1 && 2 = "+(1 && 2));
1/1/0/2
逻辑与返回第一个是 false 的操作数 或者 最后一个是 true的操作数
逻辑或返回第一个是 true 的操作数 或者 最后一个是 false的操作数
- 代码输出的是什么?
var a={},
b={key:'b'},
c={key:'c'};
a[b]=123;
a[c]=456;
console.log(a[b]);
答案是:456
其原因如下:当设置对象属性时,JavaScript将隐式地字符串化参数值。在这种情况下,由于b和c都是对象,因此它
们都将转换为“[object Object]”。因此,a [b]和a [c]都等价于[“[object Object]”],并且可以互换使用。因此,设置或参
考a [c]与设置或参考a [b]完全相同。
- 以下代码输出什么?
var hero = {
_name: 'John Doe',
getSecretIdentity: function (){
return this._name;
}
};
var stoleSecretIdentity = hero.getSecretIdentity;
console.log(stoleSecretIdentity()); // undefined
console.log(hero.getSecretIdentity()); // John Doe
stoleSecretIdentity 的上下文是全局环境,所以第一个输出 undefined。若要输出 John Doe,则要通过 call 、apply 和 bind 等方式改变
stoleSecretIdentity 的this 指向(hero)。
第二个是调用对象的方法,输出 John Doe。
- 给你一个 DOM 元素,创建一个能访问该元素所有子元素的函数,并且要将每个子元素传递给指定的回调函数。函数接受两个参数:DOM,指定的回调函数
原文利用 深度优先搜索(Depth-First-Search) 给了一个实现:
function Traverse(p_element,p_callback) {
p_callback(p_element);
var list = p_element.children;
for (var i = 0; i < list.length; i++) {
Traverse(list[i],p_callback); // recursive call
}
}
- 如何做到二维数组降维为一维数组
function reduceDimension(arr) {
return Array.prototype.concat.apply([], arr);
} // 利用apply的第二个参数可以传一个数组,同时会依次调用concat的办法:
Array.prototype.concat.apply([], [[99, 98], [97, 96], [95]]) // [99, 98, 97, 96, 95]