javascript面试题(一)
1.
var bar = null;
console.log(typeof bar === 'object');
//logs true!
尽管 typeof bar === "object" 是检查 bar 是否对象的可靠方法,令人惊讶的是在JavaScript中 null 也被认为是对象!
2.
(function(){
var a = b =3;
})();
console.log(typeof a == 'undefined'); //true
console.log(typeof b == 'undefined'); //false
这个时候的变量b声明是不加关键字var的,也就是说变量b是全局变量(隐式全局变量)。
他等同于
b = 3;
var a =b ;
如果使用严格模式(use strict)结果会是:
报错:b is not undefined
3.
var myObject = {
foo: "bar",
func: function() {
var self = this;
console.log(this.foo);
console.log(self.foo);
(function() {
console.log(this.foo);
console.log(self.foo);
}());
}
};
myObject.func(); // bar bar undefined bar
在外部函数中, this 和 self 两者都指向了 myObject ,因此两者都可以正确地引用和访问 foo 。
在内部函数中, this不再指向myObject。其结果是,this.foo 没有在内部函数中被定义,相反,指向到本地的变量 self 保持在范围内,并且可以访问。 (在ECMA 5之前,在内部函数中的this 将指向全局的 window 对象;反之,因为作为ECMA 5,内部函数中的功能this 是未定义的。)
4.use strict有什么好处?
function foo1(){
return {
bar: "hello"
};
}
function foo2(){
return
{
bar: "hello"
};
}
返回结果
console.log(foo1()); // bar:"hellow";
console,log(foo1()); //undefined
当碰到 foo2()中包含return语句的代码行(代码行上没有其他任何代码),分号会立即自动插入到返回语句之后。请仔细留意上面两个函数中return的不同之处,foo2函数的return是单独一行的。
6.
console.log(typeof NaN === "number");
// logs "true"
//如果拿NaN与本身比较
console.log(NaN === NaN )
// logs "false"
一种半可靠的方法来测试一个数字是否等于 NaN,是使用内置函数 isNaN(),但即使使用 isNaN() 依然并非是一个完美的解决方案。
7.
console.log(1 + "2" + "2");
// logs "112";
1 + "2" 是执行的第一个操作。由于其中一个运算对象 "2" 是字符串,JavaScript会假设它需要执行字符串连接,因此,会将 1 的类转换为 "1" , 1+"2" 结果就是 "12" 。然后, "12"+"2" 就是 "122" 。
console.log(1 + +"2" + "2");
// logs "32"
根据运算的顺序,要执行的第一个运算是 +"2" (第一个 "2" 前面的额外 + 被视为一元运算符)。
因此,JavaScript将 "2" 的类型转换为数字,然后应用一元 + 号(即将其视为一个正数)。其结果就是得到一个数字 2 ,接下来的运算就是 1 + 2 ,这当然是 3 。
然后3+"2"Javascript会假设它需要执行字符串链接,因此会将3的类型转化为"3",结果就是"32"
console.log(1 + -"1" + "2");
// logs "02"
根据运算的顺序,要执行的第一个运算是 -"1" (第一个 "1" 前面的额外 + 被视为一元运算符)
因此,JavaScript将 "1" 的类型转换为数字,然后应用一元 + 号(即将其视为一个正数)。其结果就是得到一个数字 21,接下来的运算就是 1 - 1,这当然是 0
然后0+"2"Javascript会假设它需要执行字符串链接,因此会将0的类型转化为"0",结果就是"02"
console.log(+"1" + "1" + "2");
// logs "112"
虽然第一个运算对象 "1" 因为前缀的一元 + 运算符类型转换为数值,但当连接到第二个运算对象 "1" 的时候,又立即转换回字符串,然后又和最后的运算对象 "2" 连接,产生了字符串 "112" 。
console.log( "A" - "B" + 2);
// logs NaN
"A" - "B" 结果为 NaN 。但是,应用任何运算符到 NaN 与其他任何的数字运算对象,结果仍然是 NaN 。
console.log("A" - "B" + "2")
// logs "NaN2"
由于运算符 - 不能被应用于字符串,并且 "A" 和 "B" 都不能转换成数值,因此, "A" - "B" 的结果是 NaN ,然后再和字符串 "2" 连接,得到 "NaN2" 。
8. | | 或 && 运算符
表达式a && 表达式b : 计算表达式a(也可以是函数)的运算结果,
如果为 True, 执行表达式b(或函数),并返回b的结果;
如果为 False,返回a的结果;
表达式a || 表达式b : 计算表达式a(也可以是函数)的运算结果,
如果为 Fasle, 执行表达式b(或函数),并返回b的结果;
如果为 True,返回a的结果;
9. 以下代码输出什么,为什么?
var a={},
b={key:'b'},
c={key:'c'};
a[b]=123;
a[c]=456;
console.log(a[b]);
// logs 456
b,c做属性时,都会隐式转化为[object object],当两个都为[object object]时,后者会覆盖前者即无论console.log(a[b])或console.log(a[c])输出结果都为456;
10.关于this指向,this指向谁
var person = {
_name: 'I am John',
sayHello: function (){
return this._name;
}
};
var sayHello = person.sayHello;
console.log(sayHello()); //undefined
console.log(person.sayHello()); //I am John
当执行sayHellow时,this._name指向window窗口,在window下找_name属性已经不存在,所以为undefined;
11.关于变量提升
function test() {
console.log(a);
console.log(foo());
var a = 1;
function foo() {
return 2;
}
}
test(); //undefined 2
变量和函数都被提升到了函数体的顶部,Js编译的阶段会找到所有的申明,包括变量申明和函数申明,他们会在代码执行前被编译处理提前执行,就好像位置被提前到前面,
提身后的代码如下:
function text() {
var a ;
function foo() {
return 2;
}
console.log(a);
console.log(foo());
a = 1;
}
}
test();
代码从上而下执行,所以调用函数后执行的解果为 undefined 和 2.
12.事件循环
function printing() {
console.log(1);
setTimeout(function() {
console.log(2);
}, 1000);
setTimeout(function() {
console.log(3);
}, 0);
console.log(4);
}
printing(); // 1 4 3 2;
当调用setTimeout时,即使设置的时间为0时,也会被排队.先执行其他非延迟语句执行完成后,才会执行.
13.理解应用闭包
function outFunc(){
var name = "前端君";
function inFunc(){
console.log(name);
}
return inFunc;
}
inFunc(); //控制台显示"前端君"
函数inFunc认可访问outFunc私有属性
14.关于delete删除符
var x = 1;
var output = (function(){
delete x;
return x;
})(); console.log(output); //1
delete 操作符是将 object 对象的属性删去的操作。但是这里的 x 是并不是对象的属性, delete 操作符并不能作用,所以打印的出的结果仍然是 x 的值。
15.
var x = { foo : 1};
var output = (function(){
delete x.foo;
return x.foo;
})();
console.log(output); // undefined
delete 操作符是将 object 对象的属性删去的操作.删除后.x变为var x;然后在访问它,申明但未赋值.所以为undefined.
16.
var name = 'World!';
(function () {
if (typeof name === 'undefined') {
var name = 'Jack';
console.log('Goodbye ' + name);
} else {
console.log('Hello ' + name);
}
})(); //Goodbye Gack;
变量提升,提升后代码如下
var name;
(function () {
var name;
if(typeof name === 'undefined') {
name = 'Jack';
console.log(Goodbye' + name);
} else {
console.log('Hellow ' + name);
}
})();
name = 'World';
所以执行if时,name为赋值,执行第一个if语句,结果就是Goodbye Gack;
17.
["1", "2", "3"].map(parseInt); //[1,NaN,NaN]
结果分析
parseInt("1",0); // 当参数为0时,则以十为基数来解析
parseInt("2",1); // NaN,第二个参数的范围为2~36
parseint("3",2); // NaN
18.
[typeof null, null instanceof Object] // [object , false]
null并不是从原型链上创建出来的,所以null instanceof object 为false
typeofnull为object
19.
var a = [0];
if ([0]) {
console.log(a == true);
} else {
console.log("wut");
}
// logs false;
当判断时会将[0]转换为"0",然后转化为布尔类型,0为true,然后执行if语句第一个,a == true;a为数组所以转换为0,true转换为数字类型为1;0 != 1,所以返回false.
20.
(function(){
var x = y = 1;
})();
console.log(y); // 1
console.log(x); // error
由于y未申明,所以y会隐式转化为全局变量,即:
var y = 1;
(function () {
var x = y = 1;
})();
函数外面是无法访问函数里面的变量的,所以会出现x is not defined;会报错
21.
var a = [1, 2, 3],
b = [1, 2, 3],
c = [1, 2, 4];
console.log(a == b); //false
console.log(a === b); //false
console.log(a > c); //false
console.log(a < c); //true
>>a==b,相比较,是object和object的比较,会比较他们的存储地址,很显然他们的存储地址不同,所以返回false;
>>a===b,运算要求两边的数值和类型完全相同,a,b类型都为object/array,但是他们应用地址不同,所以返回false;
>>a>c,数值比较,由于数组不能比较,所以会转换为字符串类型,"1,2,3">"1,2,4",显然3<4,所以返回false;
>>a<c,同上原理,所以返回true
22.
var two = 0.2;
var one = 0.1;
var eight = 0.8;
var six = 0.6;
[two - one == one, eight - six == two] //logs [true , false]
二进制
23
'5' + 3
'5' - 3
// logs "53"
// logs 2;
js中 + 除了运算符外还有连接作用,运算符一般都会先转换为number类型然后在运算, + 不会,如果 + 两边一边是 数字 一边是字符串,会做拼接字符串的操作
javascript面试题(一)的更多相关文章
- 你应该知道的25道Javascript面试题
题目来自 25 Essential JavaScript Interview Questions.闲来无事,正好切一下. 一 What is a potential pitfall with usin ...
- 互联网中级Javascript面试题
互联网中级Javascript面试题 1.实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number.String.Object.Array.Boolean)进行值复制 ...
- 互联网公司前端初级Javascript面试题
互联网公司前端初级Javascript面试题 1.JavaScript是一门什么样的语言,它有哪些特点?(简述javascript语言的特点)JavaScript是一种基于对象(Object)和事件驱 ...
- 一道 JavaScript 面试题
有一道 JavaScript 面试题. f = function () { return true; }; g = function () { return false; }; (function() ...
- 人人网javascript面试题
JavaScript面试题要求:以下题目必须从一至四题中,选出三道题,使用原生代码实现,不可使用任何框架,第五题为选作题. 一. 在页面的固定区域内实现图片的展示 <ignore_ ...
- 【转】典型的JavaScript面试题
问题1: 作用域(Scope) (function() { "use strict"; var a = b = 5; })(); console.log(b); 控制台(conso ...
- 5个经典的JavaScript面试题
在IT界中公司对JavaScript开发者的要求还是比较高的,但是如果JavaScript开 发者的技能和经验都达到了一定的级别,那他们还是很容易跳到优秀的公司的,当然薪水就更不是问题了.但是在面试之 ...
- JavaScript面试题链接汇总
最新JavaScript笔试题(含答案) - 爱思资源网 前端工程师面试问题列表 - 爱思资源网 腾讯最新前端面试题记录分享 - 爱思资源网 优酷前端JS部分面试题 - 爱思资源网 百度校园招聘web ...
- (转载)7个去伪存真的JavaScript面试题
7个去伪存真的JavaScript面试题 上周,我发表了<C#程序员的7个面试问题>.这次我要说的是如何淘汰那些滥竽充数的JavaScript程序员. 作者:小峰来源:码农网|2015-0 ...
- 一个javascript面试题
javascript面试题代码: <script type="text/javascript"> function fun(x,y){ console.log(&quo ...
随机推荐
- Flink中的window、watermark和ProcessFunction
一.Flink中的window 1,window简述 window 是一种切割无限数据为有限块进行处理的手段.Window 是无限数据流处理的核心,Window 将一个无限的 stream 拆分成有 ...
- 插槽slot使用方法
<slot>为vue的内置标签:用于给组件定义一个插槽,在这个插槽里传入内容(可以是模板代码或者组件),达到动态改变组件的目的. v-slot指令:绑定内容到指定插槽,v-slot 只能添 ...
- 简化RESTful开发,Spring Data REST让你少掉发
1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! 前言 Springboot + Spring MVC大大简化了Web应用的RESTful开发,而Spring Data RE ...
- Dubbo系列之 (二)Registry注册中心-注册(1)
引导 dubbo的服务的注册与发现,需要通过第三方注册中心来协助完成,目前dubbo支持的注册中心包括 zookeeper,consul,etcd3,eureka,nacas,redis,sofa.这 ...
- 关于GPU你必须知道的基本知识
图形处理单元(或简称GPU)会负责处理从PC内部传送到所连接显示器的所有内容,无论你在玩游戏.编辑视频或只是盯着桌面的壁纸,所有显示器中显示的图像都是由GPU进行渲染的. 对普通用户来说,实际上不需要 ...
- 2020-07-14:es用过冷热分离吗?假如现在有些数据热变冷,有些数据冷变热,怎么解决?
福哥答案2020-07-14: 热变冷: 有x台机器tag设置为hot. 有y台机器tag设置为cool. hot集群中只存最近两天的. 有一个定时任务每天将前一天的索引标记为cool. es看到有新 ...
- C#LeetCode刷题之#746-使用最小花费爬楼梯( Min Cost Climbing Stairs)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4016 访问. 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个 ...
- 洛谷P1028.数的计算(动态规划)
题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n≤1000),然后对此自然数按照如下方法进行处理: 1.不作任何处理; 2.在它的左边加上一个自然数,但该自然 ...
- 记录一次idae和maven设置的巨坑
这个忽略pom.xml文件千万别勾选,不然会导致项目的pom.xml怎么填写都无法导入新的依赖包!
- K8s 1.18.6版本基于 ingress-nginx 实现金丝雀发布(灰度发布)
K8s 1.18.6版本基于 ingress-nginx 实现金丝雀发布(灰度发布) 环境 软件 版本 kubernetes v1.18.6 nginx-ingress-controller 0.32 ...