JavaScript 面试技巧知识

一、变量类型(typeof运算符)

1.值类型:

number(数字)、string(字符)、boolean(布尔)、null、undefined、

2.引用类型:

array(数组)、object(对象)、function(函数)

二、如何理解JSON

JSON就是JS的一个对象。
JSON.stringify({a:10,b:20})         //对象变成字符串
JSON.parse(‘{“a”:10,“b”:20}’)       //字符串变成对象

三、原型和原型链

1、构造函数:大写字母开头的函数就是构造函数

function Foo(name,age){
      this.name = name;
      this age = age;
      //return this   // 默认有这一行。可以不用写
}
var f = naw Foo('zhangsan',21)

2.原型规则

●当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的proto(即它的构造函数的prototype)中寻找。

__proto__

console.log(obj.__proto__ === Object.prototype)

3.原型链(instanceof)

instanceof 用于判断引用类型属于哪个构造函数的方法。

4.原型链继承的例子

<body>
        <div id="div1">
            hello world
        </div>
</body>

<script type="text/javascript">
        
        function Elem(id){
            this.elem = document.getElementById(id);
        }
        
        Elem.prototype.html = function(val){
            var elem = this.elem;
            if(val){
                elem.innerHTML = val
                return this   //链式操作
            }else{
                return elem.innerHTML;
            }
        }
        
        Elem.prototype.on = function(type,fn){   // 创建事件绑定方法
            var elem = this.elem;
            elem.addEventListener(type,fn)
        }
        var div1 = new Elem("div1");
        console.log(div1.html());

</script>

四、作用域和闭包

1、作用域

● 没有块级作用域
● 只有函数和全局作用域

2、闭包

<script type="text/javascript">
        function F1(){
            var a = 100;
            return function(){
                console.log(a)
            }
        }
        var f1 = F1();
        var a = 200;
        f1();   // 100      
</script>
闭包的使用场景

● 函数作为返回值
● 函数作为参数传递

五、异步和单线程

1、什么是异步

 console.log(100)
 setTimeout(function(){
       console.log(200)
 },1000)
 console.log(300)

// 打印出来的顺序是 100 300 200

2、对比同步

 console.log(100)

 alert(200)  // 弹出来之后不点确定就不会继续执行下面

 console.log(300)

3、使用异步的场景

● 定时任务:setTimeout ,setInverval
● 网络请求:ajax请求 ,动态 <img> 加载
● 事件绑定

4、同步的异步的区别

同步会阻塞代码执行,异步不会
alert是同步,setTimeout是异步

5、异步和单线程

 console.log(100)
 setTimeout(function(){
       console.log(200)
 },1000)
 console.log(300)
执行第一行,打印100,
执行setTimeout后,传入setTimeout的函数会被暂存起来,不会立即执行(单线程的特点:不能同时做两件事)
执行最后一行,打印300,
待所有程序执行完,处于空闲时间是,会立马看有没有被暂存起来的要执行。
发现暂存起来setTimeout中的函数无需等待时间,就立刻来过来执行。

六、Js-Web-API(W3C标准)

1、DOM本质

● DOM可以理解为:浏览器把拿到的html代码,结构化一个浏览器能识别并且js可以操作的一个模型而已。

2、DOM节点、结构操作

DOM对象方法.png

3、DOM节点的Attribute和property的区别

● property 只是一个JS对象的属性的修改
● Attribute 是对html标签属性的修改

4、BOM操作

常用对象:navigator、screen、history、location
如何检测浏览器的类型:
var ua = navigator.userAgent
var isChrome = ua.indexOf("Chrome")
console.log(isChrome)
拆解url各个部分
console.log(location.href)
console.log(location.protocol)   // "http:"
console.log(location.hostname)   // "baidu.com"
console.log(location.pathname)
console.log(location.search)
console.log(location.hash)   // "#contents"

5、事件

<body>
        <div id="div1">
            <a href="http://baidu.com" id="link1">baidu.com</a>
            <p id="p1">激活</p>
            <p id="p2">取消</p>
        </div>
        <div id="div2">
            <p id="p3">取消</p>
            <p id="p4">取消</p>
        </div>
</body>

①、取消默认行为

//第一种:
var link1 = document.getElementById("link1");
link1.addEventListener("click",function(e){
    e.preventDefault()   //取消默认行为
    console.log(123)
})

-------------------------------------------------------
//第二种:
//包装事件函数
function bindEvent(elem,type,fn){
    elem.addEventListener(type,fn)
}
var link1 = document.getElementById("link1");
bindEvent(link1,"click",function(e){
    e.preventDefault();  //取消默认行为
    console.log(123)
})

②、监听事件、阻止冒泡

function bindEvent(elem,type,fn){
    elem.addEventListener(type,fn)
}
    
var p1 = document.getElementById('p1');
bindEvent(p1,"click",function(e){
    e.stopPropagation();    // 防止监听
    alert("激活")
});
var body = document.body
bindEvent(body,"click",function(e){
        alert('取消')
})

③、代理

function bindEvent(elem,type,selector,fn){
        if(fn == null){
        fn = selector
        selector = null
}
elem.addEventListener(type,function(e){
        if(selector){
            //代理
            var target = e.target;
            if(target.matches(selector)){
                fn.call(target,e)
            }
        }else{
            //不是代理
            fn(e)
        }
    })
}
        
var div1 = document.getElementById("div1");
bindEvent(div1,"click","a",function(e){
    e.preventDefault();  //取消默认行为
    console.log(this.innerHTML)
})
var p1 = document.getElementById('p1');
bindEvent(p1,"click",function(e){
    console.log(p1.innerHTML)
})

● 代理的两个好处:①代码简洁(绑定一次就可以了),②给浏览器的压力比较小。

6、Ajax - XMLHttpRequst

var xhr = new XMLHttpRequset();   //实例化一个ajax对象
xhr.open("GET","/api",false)     //这一步,就是已经是发送请求了
xhr.onreadystatechange = function (){
    if(xhr.readyState == 4){
        if(xhr.status == 200){  
            //status==200表示请求成功
            //404表示没有找到页面或者数据
            alert(xhr.responseText)
        }
    }
}
xhr.send(null);
状态码说明
①、readyState
● 0 - (未初始化)还没有调用send()方法
● 1 - (载入)已调用send()方法,正在发送请求
● 2 - (载入完成)send()方法执行完成,已经接受到全部内容
● 3 - (交互)正在解析响应内容
● 4 - (完成)解析内容响应完成,可以在客户端调用了
②、status
● 2xx - 表示成功处理请求,如:200
● 3xx - 需要重定向,浏览器直接跳转
● 4xx - 客服端请求错误,如:404
● 5xx - 服务器端错误。

7、跨域(JSONP)

可以跨域的三个标签及场景

<img src="xxx"> 用于打点统计,统计网站可能是其他域
<link href="xxx"> 可以使用CDN,CDN也是其他域,
<script src="xxx"> 可以使用CDN,可以用于JSONP。

跨域的注意事项

● 所有的跨域请求都必须经过信息提供方的允许
● 如果未经允许即可获得,那是浏览器同源策略出现漏洞

JSONP实现原理

● 假如加载 http : // baidu.com / classname.html
● 不一定服务器端真的有一个classname.html文件
● 服务器可以根据请求,动态生成一个文件,返回。

服务器端设置 http header

● 另一个解决跨域的简洁方法,需要服务器来做
● 但是作为交互方,我们必须知道这个方法(不一定要去深究)

8、存储

cookie

● 本身用于客服端和服务器端通信
● 但是它有本地存储的功能,于是就被 “借用”
● 使用 document.cookie = ... 获取和修改即可

cookie用于存储的缺点

● 存储量太小,只有4KB
● 所有 http 请求都带着,会影响获取资源的效率
● API 简单,需要封装才能用 document.cookie = ...

locationStorage 和 sessionStorage

● HTML5 专门为存储而设计,最大容量5M
● API 简答易用
● locationStorage.setItem(key,value);locationStorage.getItem(key) 【一个存储,一个获取】

以上三个存储方式的区别

容量;是否携带到ajax中;API易用性

七、开发环境

1、关于开发环境

● IDE (写代码的效率,工具)
● git (代码版本管理,多人协作开发)
● JS 模块化
● 打包工具
● 上线回滚的流程

2、IDE

● webstorm
● sublime (搜索插件安装)
● vscode
● atom

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • 一、Lambda表达式 一般格式: 说明: 小括号内的语法与传统方法参数列表一致:无参数则留空;多个参数则用逗号分...
    哈哈大圣阅读 641评论 0 0
  • 今天晚上天气挺好,我就让爸爸带二宝出去玩,我在家陪大宝学习,这样我们可以安静的学习,能让他静下心来学习。通过这段时...
    爱你的贝贝阅读 134评论 0 3
  • 感情从来都是这个样子。 都知道高中是青少年们萌生爱意选择恋爱的好年纪,也都知道高中的感情虽然单纯美丽却都大多得不到...
    断点儿阅读 642评论 0 0
  • 能感受到失败、病痛、不如意, 是幸运的。 至少它提醒我们还活着, 该换一种方式生活了。 人生, 无论顺境、逆境, ...
    熬成红豆阅读 183评论 0 0