js基础

92 阅读4分钟
变量的类型和计算
  引用类型:  对象   数组   函数

### typeof
### typeof undefined    //undefined
### typeof null   //object
### typeof console.log    //function
### typeof只能区分值类型  对引用类型区分不出来(函数除外)

# 3.强制类型转换
# 字符串拼接 var b = 100+"10" //'10010'
# ==运算符  null == undefined      100 == "100"   0 == ''
# if语句   var c =''   if(c){}
# 逻辑运算    10&&0 //0            "||"abc"  //"abc"
4.obj.a ==null  相当于  obj.a ===null || obj.a===undefined  简写形式 jquery源码中的
5.js内置函数 数据封装类对象  Object  Array  Boolean  Number  String Function Date RegExp Error
6.js变量存储方式   值类型  引用类型  
7.JSON是一个js对象 也是一种数据格式   JSON.stringify({a:10,b:20})  JOSN.parse('{"a":10,"b":20}')
8. 0  NaN '' null undefined false

# 原型和原型链
题目
如何准确判断一个变量是数组类型   变量 instanceof Array
写一个原型链继承的列子
描述new一个对象的过程
zepto(或其他框架)源码中如何使用原型链


原型中原型的一些特点串起来形成一个链式结构叫原型链  instanceof是原型链的一个表现


构造函数
function Foo(name,age){
this.name=name
this.age=age
this.class="class-1"
//return this //默认有这一行
}
var f =new Foo("zhangsan",20)
描述new一个对象的过程
第一步:创建一个空对象
第二步:this指向这个对象
第三步:执行代码,即对this赋值
第四步:返回this


var a={}  其实是var a = new Object()的语法糖  a.__proto__ ===Object.prototype
var a=[]  其实是var a = new Array()的语法糖
function Foo(){...}其实是var Foo = new Function(...)
使用instanceof判断一个函数是否是一个变量的构造函数

原型规则是学习原型链的基础
所有的引用类型(数组,对象,函数),都具有对象特性,即可自由扩展属性(除了“null”意外)
var obj ={}    obj.a=100
var arr =[]   arr.a=100
function fn(){}   fn.a=100
所有的引用类型(数组,对象,函数),都有一个__proto__属性(隐式原型),属性值是一个普通的对象
所有的函数,都有一个prototype属性(显示原型),属性值也是一个普通的对象
所有的引用类型(数组,对象,函数),__proto__属性值指向它的构造函数的“prototype”的属性值

当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么回去它的__proto__(即它的构造函数prototype)中农寻找
//构造函数
functioon Foo(name,age){
this.name=name
}
Foo.prototype.alertName = function(){
alert(this.name)
}
//创建示例
var f =new Foo('zhnagsan')
f.printName=function(){
console.log(this.name)
}
//测试
f.printName()
f.alertName()
要去f.__proto__.__proto__中查找



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


执行期上下文  
范围:一段《script》或者是一个函数
全局:变量定义,函数声明
函数:变量定义,函数声明,thisarguments


this要在执行时确认
作为构造函数执行   
作为对象属性执行
作为普通函数执行
call apply  bind

 var a={
        name:"a",
        fn:function(){
            console.log(this.name)
        }
      }
      a.fn() //this===a
      a.fn.call({name:"b"}) //this==={name:"b"
      var fn1 = a.fn
      fn1() //this==window


闭包使用场景   函数作为返回值   函数作为参数来传递
var i
for(i=0;i<10;i++){
    (function (i){
        var a=document.createElement("a")
        a.innerHTML=ii+"<br>"
        a.addEventListener("cliick",function(e){
            e.preventDefault()
            alert(i)
        })
        document.body.appendChild(a)
    })(i)
}

作用域
自用变量   作用域链 即自由变量的查找    闭包的两个场景

同步会阻塞代码执行  而异步不会

alert是同步 setTimeput是异步

异步场景 : 
定时任务:setTimeout  setIInverval
网络请求:ajax请求  动态《img》加载
事件绑定


Date.now()
var dt =new Date()
dt.getTime()获取毫秒数
dt.getFullYear()年
dt.getMonth()月  0 -11
dt.getDate()日 0- 31 
dt.getHours()小时 0-23
dt.getMinutes()分钟 0-59
dt.getSeconds()秒 0-59

forEach遍历所有元素
every判断所有元素是否都符合条件
some判断是否有至少一个元素符合条件
sort 排序  从小到大  return a- b
map 对元素重新组装,生成新数组
var arr=[1,2,3]
arr.forEach(function (item,index){
console.log(index,item)})

var arr=[1,4,2,3,5]
var arr2 = arr.sort(function(a,b){
return  a-b   //从小到大
})

获取2022-07-05格式的日期
function formatDate(dt){
    if(!dt){
        dt=new Date()
    }
    var year =dt.getFullYear()
    var month=dt.getMonth()+1
    var date =dt.getDate()
    if(month<10){
        month='0'+month
    }
    if(date<10){
        date='0'+date
    }
    return year+'-'+month+'-'+date
}
var dt =new Date()
var formatDate=formatDate(dt)
console.log(formatDate);


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



字符串类型的随机
var random = Math.random()
var random = random + '0000000000'
var random = random.slice(0,10)
console.log(typeof random);