JavaScript 对象后的面试题
1、包装类的面试题
var str = "abc"; str += 1; var test = typeof(str); if(test.length == 6){ test.sign = "typeof的返回结果可能是String"; } console.log(test.sign);
思路:
1. str += 1 字符串加数字1,等于字符串格式的 "abc1"
2. var test = typeof(str) str是字符串类型,返回的是字符串格式的"String"
3. if(test.length == 6) 系统隐式的 new Strong(test).length 能返回长度6(返回后自动销毁),6==6能进入if语句
4. test.sign = "typeof..." 原始值赋值调用包装类 new String(test).sign="typeof的返回结果可能是String"
赋值后销毁,赋值跟没赋值一样
5. console.log(test.sign) 访问 test.sign 系统会再一次调用包装类 new String(test).sign 没有sign属性返回undefined
费劲千辛万苦终于进入条件,掉以轻心就错了,一放松就错了,这道题是成哥出的。
PS:
quiz 是小测试的意思
2、运行 test() 和 new test() 的结果分别是什么?
this.a 这个this有一条规则,如果不用new操作,任何执行其上下文里的this原本都指向window。除非new操作的this指向一个空对象。
var a = 5; function test(){ a = 0; alert(this.a); var a; alert(a); } test(); // 先输出5,在输出0 var demo = new test(); // 先是undefined,第二次是0
3、分析下面javascript代码片段
function employee(name ,code){ this.name = "wangli"; this.code = "A001"; } var newemp = new employee("张三" ,"A002"); // 显而易见的没用参数,函数里面的值给写死了是固定的 document.write("催员姓名: " + newemp.name + "<br/>"); // 催员姓名: wangli document.write("催员代号: " + newemp.code + "<br/>"); // 催员代号: A001
4、考闭包的面试题
function Person(name ,age ,sex){ var a = 0; this.name = name; this.age = age; this.sex = sex; function sss(){ a ++; document.write(a + "<br/>"); } this.say = sss; } var oPerson = new Person(); oPerson.say(); oPerson.say(); var oPerson1 = new Person(); oPerson1.say();
1). 这三行(this.name/age/sex)都是添加属性的流程
this.say = sss; 这行也是添加属性的流程,但是属性值是函数体
sss方法被挂到this对象上了,由于new之后会隐式的把this对象给返回出去,sss方法挂对象身上了也被返回到外面。
2). 被返回出去的sss方法就会保存Person的劳动成果形成闭包,Person的劳动成果里有一个变量a,
3). 所以say()执行的时候a++返回1,再执行在原有的基础上加加变成2
4). 然后紧接着oPerson1重新再new一次Person(),又重写执行一次Person函数体,生成了一个新的执行上下文跟刚才的没关系了,
5). 产生一个新的对象并且返回,又产生了新的闭包,这个新闭包是全新的一个a变量,全新的执行期上下文,所以这次执行打印1
5、下面这段js代码执行完毕后x、y、z的值分别是多少?(2013年左右的百度笔试题)
var x = 1, y = z = 0; function add(n){ return n = n + 1; } y = add(x); function add(n){ return n = n + 3; } z = add(x); /*** x = 1; y = 0; z = 0; function add(n){ return n = n + 3; } y = add(x); 结果: x = 1 y = 4 z = 4 ***/
解题思路
1). 这两个函数名(add)是一样的,函数有一个提升的过程,不可能有两个函数同时挂着,执行顺序和预编译顺序是两回事。
2). 调用的add()是预编译完的add(),是上GO里面拿的,不是在视觉上看的,不能被视觉上蒙了。
3). 下面的add函数会覆盖上面的add函数,不论在那个位置调用add(),就是代码顶部调用也是 n = n + 3
6、下面代码中console.log的结果是[1、2、3、4、5]的选项是:?(alibaba的面试题)答案是A,C,D
A
function foo(x){ console.log(arguments); // console.log能打印出[1、2、3、4、5],就不用管return了 return x; } foo(1,2,3,4,5);
B
function foo(x){ console.log(arguments); return x; }(1,2,3,4,5) // 这个结果不报错但也不执行,系统会把括号分离开
C
(function foo(x){ console.log(arguments); return x; })(1,2,3,4,5) // 立即执行函数,后面加括号写在外面也行,是实参列表。1,2,3,4,5实参列表能传到arguments里面去,打印也是[1,2,3,4,5]
D
function foo(){ bar.apply(null, arguments); } function bar(x){ console.log(arguments); } foo(1,2,3,4,5);
7、我是一行文本,需要水平和垂直居中
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>一个容器宽400、高100,需要容器居中,文本水平居中</title> <style> div{ width:400px; height:100px; border:1px solid gray; line-height:100px; text-align:center; position:absolute; top:50%; left:50%; margin-left:-200px; margin-top:-50px; } </style> </head> <body> <div>我是一行文本,需要水平和垂直居中</div> </body> </html>
8、请问以下表达式的结果是什么?
/** * 3是数字, * 8是基底(八进制)取值范围2-36 * 以8进制为基底转化为十进制,拿3当做八进制数也是3 * */ parseInt(3 ,8); // 3 parseInt(3 ,2); // 二进制里没有3只有1跟0,执行不了返回NaN /** * 结果是3或NaN在不同浏览器上表现不同 * 零进制是有争议的,有的了浏览器认为没有零进制,有的浏览器认为报错 * 我们正常的进制2-36 * 在不同的浏览器上表现不同,返回 3/NaN * */ parseInt(3 ,0); // 3/NaN
9、下咧那些是javascript语言typeof可能返回的结果
String o
Array x
Object o
null x
10、看看下面alert的结果是什么(百度面试题)
function b(x, y, a){ arguments[2] = 10; alert(a); } b(1 ,2 ,3); // 10
arguments[2]和形参a是映射的关系
如果函数体改成下面,结果又会是什么?
function b(x, y, a){ a = 10; alert(arguments[2]); } b(1 ,2 ,3); // 10
形参a和arguments[2]是互相映射的你改我也改
11、写一个方法,求一个字符串的字节长度
提示:一个中文占两个字节,一个英文占一个字节,字符串有一个方法charCodeAr()
charCodeAr()定义和用法:
charCodeAr()方法可返回指定位置的字符串Unicode编码,返回值是0-65535之间的整数。
当返回值是<=255时为英文,当回访值>255时为中文
语法: stringObject.charCodeAt( index )
封装一个函数要求传入任意字符串都能返回字符串的长度
Unicode涵盖了ASCII码的,UniCode码前255位和ASCII码的255位是一样的,所以求UniCode和求ASCII码有时是一样的。
这个字符在UniCode编码的前255位,那一定是占一个字节的字符,如果是在255位之后那一定是占两个字节的,空格也算一个字节。
这时候回返回第0位的UniCode编码,小于255占一个字节,大于255占两个字节
var str = 'Hello world 世界你好!'; str.charCodeAt(0); // 返回第零位 H 的Unicode编码 104
循环每一位的字节长度
for(var i = 0;i < str.length; i ++){ console.log(str.charCodeAt(i)); }
字符长度的方法
function bytesLength(str){ var count = 0; for(var i = 0;i < str.length; i++){ if(str.charCodeAt(i) <= 255){ count ++; //console.log(str[i]); }else{ count += 2; //console.log(str[i]); } } return count; } var str = "abc甲乙丙"; var num = bytesLength(str);
精简一下代码
function bytesLength(str){ var count = str.length; for(var i = 0;i < str.length; i++){ if(str.charCodeAt(i) > 255){ count ++; } } return count; } var str = "abc甲乙丙"; var num = bytesLength(str);