JS知识点总结

考察点

typeof (JS变量类型)

==和 === (强制类型转换)
Jquery 源码中

if(obj.a == null){
//相当于 obj.a === null , obj.a === undefined
}

window.onload 和 DocumentCotentLoaded (浏览器渲染过程)

JS创建10个<a> 弹出对应的序号 (作用域)

模块加载器 (JS模块开发)

显现数组的随机排序(JS基础算法)

变量类型
值类型 vs 引用类型
typeOf 值类型
instanceOf 引用类型 用于判断引用类型属于哪个构造函数的方法

JSON
只不过是一个JS对象而已 有2个api

构造函数
var a={} 其实就是 var a = new Object()的语法糖
var a=[] 其实就是 var a = new Array()的语法糖
function Foo(){} 其实就是 var Foo= new Function()

原型规则
所有的引用类型(数组,对象,函数) 都有一个_proto_属性(隐式原型),属性值是一个普通对象(除了基本类型值 其他都是对象 万物皆对象)
所有的函数 都有一个prototype属性(显式原型) 属性值是一个普通对象


原型链 (封装一个DOM查询)

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)
        return this
}

var div1 = new Elem('idxxxx')
 div.html('xxxxx').on(click,function(){...})

执行上下文
1.范围: 一段<script> 或者一个函数
全局:变量定义,函数声明 (一段script)
函数:变量定义,函数声明, this, arguments (函数)
PS: 注意 函数声明 和 函数表达式的区别

在执行之前 确定 this,argument 不是声明 定义时

this
1.作为构造函数
2.作为对象属性
3.作为普通函数
4.call apply bind

作用域
1.无块级作用域
2.函数和全局作用域
在哪定义的 作用域就在哪
作用域链
1.自由变量

2.作用域链,即自由变量的查找
3.闭包的场景(收敛权限,循环)

闭包
1.函数作为返回值
2.函数作为参数传递

function F1(){
  var a =100
   return function(){
      console.log(a) //自由变量a, 父级作用域寻找
  }
}
var f1= F1()
var a=200
f1() // 100
//闭包实际应用中主要用于封装变量,收敛权限
function isFirstLoad(){
  var _list = []
  return function (id){
      if(_list.indexOf(id)>=0){
            return false
      } else{
          _list.push(id)
        return true
      }
  }
}
var firstLoad = isFirstLoad()
firstLoad(10)  //true
firstLoad(10)  //false
firstLoad(20) // true
变量_list   被保存
var i,a
for(i=0;i++;i<10){
(function(i){ 
      a= doucment.createElement('a')
      a.innerHTML = i + '<br>'
      a.addEventListener('click',function(e){
          e.preventDefault()
          alert(i)  //自由变量, 要去父作用域获取值
})
  document.body.appendChild(a) 
  })(i)

自执行函数,就是不用调用,只要定义完成,立即执行的函数

异步和单线程

JS是单线程
同步:阻塞后面的
异步:非阻塞
异步的场景:
1.定时任务:setTimeout, setInterval
2.网络请求: ajax请求,动态<img>加载
3.事件绑定


Date

Date.now()
var dt = new Date()
dt.getTime()
dt.getFullYear()
dt.getMonth()
dt.getDate()
dt.getHours()
dt.getMinutes()
dt.getSeconds()

Math

Math.random()

Array Api

1.forEach
 var arr = [1,2,3]
arr.forEach(function(item,index){
      //遍历数组的所有元素
      console.log(index,item)
})

2.every
var result = arr.every(function(item,index){
      //用来判断所有的数组元素,都满足一个条件
      if(item<2) {
        return true
    }
})

3.some
var result = arr.some(function(item,index){
      //用来判断所有的数组元素,只要有一个满足一个条件
      if(item<2) {
        return true
    }
})

4.sort
 var result = arr.sort(function(a,b){
      //从小到大排序
     return a-b
     //从大道小排序
    return b-a
})

5.map
var arr2 = arr.map(function (item,index){
    // 将元素重新组装,并返回
    return '<b>' + item + '<b>'
})

6.filter
var arr2 =  arr.filter(function(item,index){
      //通过某一个条件过滤数组
      if(item>=2){
        return true
    }
})

对象API

var obj ={
    x:100,
    y:200,
    z:300
}

var key
for (key in obj){
    //注意这里的 hasOwnProperty
  if (obj.hasOwnProperty(key)){
    console.log(key.obj[key])
    }
}

写一个能遍历对象和数组的forEach的函数
function forEach(obj,fn) {
    var key
   if (obj instanceof Array){
        //Array
        obj.forEach(function(index,item){
              fn(index,item)
    })else{
        for (key in obj) {
        //obj
            fn(key,obj[key])
        }
  } 
}


JS web api


Dom

document.getElementById
document.getElmentsByTagName
document.querySelectorAll
document.getAttribute
document.setAttribute
document.createElement
div.appendChild
div.parentElement
div.childNodes
div.removeChild
div.childNodes[0].nodeName
dive.childNodes[0].nodeType


BOM

//navigator
var ua = navigator.userAgent
var isChrome = ua.indexOf('Chrome')
//screen
screen.width
screen.height
//location
location.href
location.protocol
location.pathname
location.search
location.hash
location.host
location.search
location.hash

history.forward
history.back

事件

//通用的事件监听函数

var btn = document.getElementById('btn1')
btn.addEventListener('click',function(event){
    console.log('clicked')
})
function bindEvent(elem,type,fn){
  elem.addEventListener(type,fn)
}

//事件冒泡

bindEvent(body,'click',function(e){  e.stopPropatation()  })

//代理

div.addEventListener('click',function(e){
  var target = e.target
  if(target.nodeName ==='A'){
      //dosomething
}
})

AJAX

var xhr = new XMLHttpRequest()
xhr.open('Get',"/api",false)
xhr.onreadstatechange = function(){
  if(xhr.readystate ===4){
   if(xhr.status===200){
        alert(xhr.responseText)
  }
}
}
xhr.send()

可以跨域的三个标签

<img src=xxx> //用于打点统计,统计网站可能是其他域
<link href=xxx>
<script src=xxx>

存储

cookie
sessionStorage
localStorage


Git

git add .
git checkout xxx
git commit -m "xxxx"
git push origin master
git pull origin master
git branch
git checkout -b xxx / git checkout xxx
git merge xxx
git clone



模块化

1.AMD

define['xx.js']
require['xxx.js']
<script src="/require.min.js" data-main="./entry.js">
//异步加载 用才加载

2.CommonJS
同步加载

module.exports
var x = require('xxx')

3.wepack

压缩
打包


性能优化

1.缓存
2.懒加载
3.数据节流

var textarea = document.getElementById('text')
var timeoutId
textarea.addEventListener('keyup',function(){
        if (timeoutId){
            clearTimeout(timeoutId)
        }
      timeoutId=setTimeout(function(){ dosomething},100)
})

4.合并DOM操作
5.合并JS
6.尽早操作

window.addEventListener('load',function(){})
// 页面的全部资源加载完全才会执行,包括图片 视频
document.addEventListener('DomCotentLoaded',function(){})
//Dom 渲染完成即可执行,此时图片视频可能没有加载完

安全性

1.xss
2.xsf

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

推荐阅读更多精彩内容