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,第二次是03、分析下面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/>"); // 催员代号: A0014、考闭包的面试题
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); // 10arguments[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);