javascript高级程序设计4-5

传递参数

基本数据类型,直接在内存中存放,引用数据类型,变量名是指针
function setName(obj){
    obj.name = "zfl"
    obj = new Object()    //obj指针又指向了另外一块内存
    obj.name = "123"
}
let person = new Object()
setName(person)
console.log(person.name)

检测类型

null是object类型 typeof null –>object
检测类跟对象时用 instanceof
person instanceof Object –>person是object吗?

作用域

let color = "blue"
function change(){
    if(color == "blue"){
        color = "red"
    }
}
change()
console.log(color)
函数内可以访问函数外的作用域,函数外的不能访问函数内的,var跟let一样
with作用域块跟with平级
var没有块级作用域
if(true){
    var color="blue"
}
console.log(color)    //--->blue
let存在块级作用域
if(true){
    let color="blue"
}
console.log(color)    //--->undefined

垃圾收集

标记清除

当变量进入环境时,就将这个变量标记为进入环境。从逻辑上讲,永远不能释放进入幻境的变量所占的内存,因为只要执行流进入相应的环境,就可能会用到它们。而当变量离开环境时,则将其标记为离开环境

引用计数

跟踪记录每个值被引用的次数。当引用次数为0时,可将内存收回。
循环引用时,引用计数会崩溃,一般不用

基本变量类型在内存中占据固定大小的空间,被保存在栈内存中

引用类型的值是对象,保存在堆内存中

函数的局部变量可以访问其父作用域的变量

访问对象属性的方法

1.点表示法 person.name
2.方括号表示法 person[“name”],属性名有空格时可以这样访问 person[“first name”]

数组

创建

let colors = new Array(3) //创建length为3的数组
let values = [1,2,,] //会创建一个包含3或4项的数组
let values = [,,,] //会创建一个包含3或4项的数组

方法

Array.isArray()判断是不是数组
valueOf()、toString()
valueOf()返回的还是数组、toString()返回的是字符串
join()
使用不同的分隔符来构建字符串
var value = ["1","2","3"]
value.join("|")
console.log(value.join("|"))  //  1|2|3
栈方法
push()、pop() 数组尾
shift()、unshift() 数组头
reverse()反转排序
sort()
按照升序排序,但是排的是字符串
var values = [0,1,5,10,15]
var aftersort = values.sort()
console.log(aftersort)               //0 1 10 15 5     
var aftercomp = values.sort(function (value1, value2){
    if(value1 > value2){
        return 1
    }else if(value1 < value2){
        return -1
    }else{
        return 0
    }
})
or
var aftercomp = values.sort(function (value1, value2){
    return value2- value1
})
console.log(aftercomp)  // 0 1 5 10 15
本来想去找找js原生库函数的源代码,只在ecmascript.js里找到了定义,实际上在v8编辑器里,在

https://developer.mozilla.org/en-US/search?q=sort里,给出了详细的用法,这里就不说了。有时间看看v8源码

concat()连接,返回连接后的数组,不影响原数组
slice()接受一个或者两个参数,即要返回项的起始位置和结束位置(不包括结束位)
var values = [0,1,2,3]
var value1 = values.slice(1)
var value2 = values.slice(1,3)
console.log(value1)  // 1 2 3
console.log(value2)  // 1 2
splice()
两个参数:要删除的第一项和要删除的项数
三个参数:起始位置、要删除的项数、要插入的项数
var values = [0,1,2,3]
values.splice(0,1)
console.log(values)     // [1, 2, 3]
values.splice(0,0,"c1","c2")
console.log(values)     // ["c1", "c2", 1, 2, 3]
values.splice(0,1,"s1","s2")
console.log(values)     // ["c1", "c2", 1, 2, 3]
位置方法indexOf() lastIndexOf()
var person = {name:"zfl"}
var people = [{name:"zfl"}]
var morepeople = [people]
console.log(morepeople)
console.log(people.indexOf(person))   //-1 //查找项必须严格相等  ===  没有返回-1
console.log(morepeople.indexOf(people)) // 0
迭代方法
every():对于每一项运行给定函数,若每一项都返回true,则返回true
filter():返回true项给组成的数组
forEach(): 每项运行给定函数,无返回值
map(): 返回每次调用函数返回的结果组成的数组
some(): 若某项返回true,则返回true
var value = [1,2,3,4,5,6]
var everyResult = value.every(function (item, index, array){  //值 项数 数组
    return item>2
}) 
console.log(everyResult)   //false
var filterResult = value.filter(function (item, index, array){  //值 项数 数组
    return item>2
})
console.log(filterResult)  //[3, 4, 5, 6]
var mapResult = value.map(function (item, index, array){  //值 项数 数组
    return item = item +2
})
console.log(mapResult)   //[3, 4, 5, 6]
var forEachResult = value.forEach(function (item, index, array){  //值 项数 数组
    return item = item + 2
})
console.log(forEachResult)  //undefined

Date()

Date.parse()
接受一个表示日期的字符串参数,然后尝试根据这个字符串返回相应的日期毫秒数
时间戳转日期
详情可见如下链接,将此方法携程管道函数来执行

链接

关于Function的几个要点

函数实际上是个对象
函数名仅仅是指向对象的指针
用function name(){}定义的会存在变量提升,而let name = function(){}则不会
没有重载、没有重载、没有重载
函数名本身就是变量可以作为参数传递
函数内部的固有属性arguments和this,arguments除了保存函数的参数,有一个callee的属性,这个属性是个指针指向拥有这个arguments对象的函数,还有一个caller保存调用这个函数的引用
递归
function f(){
    if(num<=1){
        return 1
    }else{
        return num*arguments.callee(num-1)   //为了降低耦合性
    }
}
caller
function outer(){
    inner()
}
function inner(){
    console.log(arguments.callee.caller)
}
outer()   //ƒ outer(){inner()}
bind()用于绑定作用域,this值会被绑定到bind()函数的值

基本包装类型

Number
toFixed(2) 保留两位小数
toExponential(1) 10–>1.0e1返回指数形式并保留1位小数
toPrecision() 返回某个数值最合适的格式
string
trim() 去掉前后空格
toUpperCase() toLocaleLowerCase() 返回大小写
replace() 代替,可以匹配正则
例一
var date = "2017/09/27"
date = date.replace(/\//g,"-")  
console.log(date)   //2017-09-27
例二
function rep(text){
return text.replace(/[<>"]/g, function (match, pos, originalText){
    switch(match){
        case "<":
            return "小于"
        case ">":
            return "大于"
        case "\"":
            return "引号"
    }
})
}
var text = "<>\""
text = rep(text)
console.log(text)   //小于大于引号
match() 返回数组
var date = "2017/09/27"
var matches = date.match(/..\//g)  
console.log(matches) //(2) ["17/", "09/"]
如果要用RegExp对象的exec()要将字符串作为参数
search()找到某元素的位置可以为正则
split()分割字符串,一个参数就按参数分割,两个参数,第二个参数是个数字,返回第二个参数长度的数组

单体内置对象

encodeURI()用于整个URI,encodeURIComponent对部分URI
decodeURI(),decodeURIComponent分别对上述两个进行解码
eval() 只知道会改变作用域链就ok

Math

Math.ceil() 向上四舍五入
Math.floor() 向下四舍五入
Math.round() 标准四舍五入
Math.random() 产生一个0——1的随机数

javascript高级程序设计4-5
https://zhangfuli.github.io/2017/09/13/javascript高级程序设计4-5/
作者
张富利
发布于
2017年9月13日
许可协议