变量的类型和计算
引用类型: 对象 数组 函数
### typeof
### typeof undefined
### typeof null
### typeof console.log
### typeof只能区分值类型 对引用类型区分不出来(函数除外)
# 3.强制类型转换
# 字符串拼接 var b = 100+"10"
# ==运算符 null == undefined 100 == "100" 0 == ''
# if语句 var c ='' if(c){}
# 逻辑运算 10&&0
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"
}
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》或者是一个函数
全局:变量定义,函数声明
函数:变量定义,函数声明,this,arguments
this要在执行时确认
作为构造函数执行
作为对象属性执行
作为普通函数执行
call apply bind
var a={
name:"a",
fn:function(){
console.log(this.name)
}
}
a.fn()
a.fn.call({name:"b"})
var fn1 = a.fn
fn1()
闭包使用场景 函数作为返回值 函数作为参数来传递
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);