面试

刷题之旅-4399前端笔试题

2017-08-09  本文已影响741人  始悔不悟

选择题

以下代码输出的结果为:

function test() {
    var n = 4399;

    function add() {
        n++;
        console.log(n);
    }

    return {
        n: n,
        add: add,
    }
}

var result = test();
var result2 = test();
result.add(); // 闭包 4400
result.add(); // 闭包 4401
console.log(result.n); // 返回对象自身的n 4399
result2.add(); //闭包 4400

以下关于BFC描述错误的是

  1. BFC的区域会与float的元素区域重叠 // 错误 不会重叠
  2. 计算BFC的高度时,浮动子元素也参与计算 // overflow:hidden清除浮动的原理
  3. BFC就是页面上的一个隔离的独立容器,容器里面的子元素是不会影响到外面的元素 // 正确
  4. BFC意为”块级格式化上下文” // 正确

ajax状态码

0 : 未初始化. 尚未调用open()方法
1 : 启动. 已经调用open()方法, 但未用send()方法.
2 : 发送. 已经调用send()方法, 但未接收到响应.
3 : 接收. 已经接收到部分相应数据.
4 : 完成. 已经接收到全部响应数据, 而且已经可以在客户端使用了.

以下 javascript 代码,在浏览器中运行的结果是

var foo = {
    n: 1,
}

(function(foo){
    console.log(foo.n);
    foo.n = 3;
    var foo = {
        n: 2,
    }
    console.log(foo.n);
})(foo);
console.log(foo.n)

等价于:

var foo;
foo = {
    n: 1,
}
(function(foo){
    var foo;  // 优先级低于形参,无效。
    console.log(foo.n); // 1
    foo.n = 3; // 形参与实参foo指向的内存空间里的n的值被改为3
    foo = { // 形参foo指向了新的内存空间,里面n的值为2.
        n: 2,
    }
    console.log(foo.n); // 输出新的内存空间的n的值 2
})(foo);
console.log(foo.n) // 实参foo的指向还是原来的内存空间,里面的n的值为3.

输出结果为: 1 2 3

AMD 与 CMD

链接:https://www.nowcoder.com/questionTerminal/6ddbcdea36724f50ac73fa350bf70b4f
来源:牛客网

AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。
AMD也采用require()语句加载模块,但是不同于CommonJS。 主要有两个Javascript库实现了AMD规范:require.js和curl.js。 参考链接:http://www.ruanyifeng.com/blog/2012/10/asynchronous_module_definition.html
AMD 是 RequireJS 在推广过程中对模块定义的规范化产出。 CMD是SeaJS在推广过程中对模块定义的规范化产出。
区别:

  1. 对于依赖的模块,AMD 是提前执行,CMD是延迟执行。
  2. CMD 推崇依赖就近,AMD 推崇依赖前置。

// CMD

define(function(require, exports, module) { 
    var a = require('./a') 
    a.doSomething() // 此处略去 100 行 
    var b = require('./b') // 依赖可以就近书写 
    b.doSomething() // 
    ...  
})   

// AMD 默认推荐的是

define(['./a', './b'], function(a, b) {  // 依赖必须一开始就写好
    a.doSomething() // 此处略去 100 行 
    b.doSomething()
    ... 
})

Cookie localStorage sessionStorage

  1. 数据的生命期:
    cookie: 一般由服务器生成,可设置失效时间。如果在浏览器端生成Cookie,默认是关闭浏览器后失效
    localStorage: 除非被清除,否则永久保存
    sessionStorage: 仅在当前会话下有效,关闭页面或浏览器后被清除

  2. 存放数据大小:
    cookie: 4k左右
    localStorage: 一般为5MB
    sessionStorage: 同上

  3. 与服务器端通信:
    cookie: 每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题
    localStorage: 仅在客户端(即浏览器)中保存,不参与和服务器的通信
    sessionStorage: 同上

  4. 易用性:
    cookie: 需要程序员自己封装,源生的Cookie接口不友好
    localStorage: 原生接口可以接受,亦可再次封装来对Object和Array有更好的支持
    sessionStorage: 同上

Object.defineProperty()

使用object.defineProperty可向对象添加或者修改属性

var obj = {
    test:"hello"
}
//对象已有的属性添加特性描述
Object.defineProperty(obj,"test",{
    configurable:true | false,
    enumerable:true | false,
    value:任意类型的值,
    writable:true | false
});
//对象新添加的属性的特性描述
Object.defineProperty(obj,"newKey",{
    configurable:true | false,
    enumerable:true | false,
    value:任意类型的值,
    writable:true | false
});

CSS继承

肯定有很多人不知道什么是继承,继承就是指子节点默认使用父节点的样式属性。
不可继承的属性太多了不要背,记住可以继承的属性有哪些就行了。可以继承的属性很少,只有颜色,文字,字体间距行高对齐方式,和列表的样式可以继承。这么来记很轻松的呀!不要被下边的吓到了哦~

所有元素可继承: visibility  cursor
内联元素可继承: letter-spacing  word-spacing  white-space  line-height  color  font  font-family  font-size  font-style  font-variant  font-weight  text-decoration  text-transform  direction
终端块状元素可继承:text-indent和text-align
列表元素可继承:list-style  list-style-type  list-style-position  list-style-image

跨域

在前端数据访问过程中,由于同源策略的限制,往往会遇到一些跨域的问题,以下哪些手段可以解决跨域的问题:

  1. 利用HTML5 postMessage
  2. 利用document.domain+iframe的设置
  3. 通过服务端niginx配置跨域
  4. 利用iframe+location.hash
  5. windows,name实现跨域数据传输

在一个html静态网站里A页面需要跳转并传递相关数据到B页面(两个页面处于同个域名下)请按照你对此场景的理解写出N中页面之前传参的代码(只需写出A页面传递参数及B页面接收参数的js关键代码)

方法一: url截取

a.html

<input type="text" id="txt" />
<button id="submit">submit</button>
<script>
    var val=document.getElementById("txt").value;
    var button=document.getElementById("submit");
    button.onclick=function(){
        location.href="b.html?"+"txt="+encodeURI(val);
    };
</script>

b.html

<script language="javascript" type="text/javascript">
    var loc = location.href;
    var n1 = loc.length;//地址的总长度
    var n2 = loc.indexOf("=");//取得=号的位置
    var id = decodeURI(loc.substr(n2+1, n1-n2));//从=号后面的内容
    alert( id);
    //document.write(id)
</script>

方法二: html5 postmessage

调用postMessage方法的window对象是指要接收消息的那一个window对象,该方法的第一个参数message为要发送的消息,类型只能为字符串;第二个参数targetOrigin用来限定接收消息的那个window对象所在的域,如果不想限定域,可以使用通配符 * 。

需要接收消息的window对象,可是通过监听自身的message事件来获取传过来的消息,消息内容储存在该事件对象的data属性中。

方法三: localStorage sessionStorage Cookie

方法四: window.name

window对象有个name属性,该属性有个特征:即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个window.name的,每个页面对window.name都有读写的权限,window.name是持久存在一个窗口载入过的所有页面中的,并不会因新页面的载入而进行重置。

更多内容戳这里

上一篇 下一篇

猜你喜欢

热点阅读