Go to comments

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);



Leave a comment 0 Comments.

Leave a Reply

换一张