美文网首页
js notebook

js notebook

作者: 大水啊大水 | 来源:发表于2017-03-01 22:50 被阅读109次

1. this 作用域

var foo = 0
function main() {
    alert(foo)  //此时foo同this.foo,为0
    //var foo = 2  //加上该句后foo为undefined,this.foo依然为0
}
main()  //执行结果为0
new main()  //该情况下函数内this指向该函数,this.foo为undefined

2. arr技巧

//arr+''或arr.toString()可以方便拍平arr,如
var arr = [1, [2, 3], [4, 5], 6]
console.log(arr+'')  //输出字符串1, 2, 3, 4, 5, 6
console.log(arr.toString())  //输出字符串1, 2, 3, 4, 5, 6
console.log(arrStr.split(','))  //输出数组[1, 2, 3, 4, 5, 6]

3. cookie的基本操作

读取、写入和删除

    var CookieUtil = {
      get: function(name) {
        var cookieName = encodeURIComponent(name) + '=', cookieStart = document.cookie.indexOf(cookieName), cookieValue = null

        if(cookieStart > -1) {
          var cookieEnd = document.cookie.indexOf(';', cookieStart)
          if(cookieEnd === -1) {
            cookieEnd = document.cookie.length
          }
          cookieValue = decodeURIComponent(document.cookie.substring(cookieStart + cookieName.length, cookieEnd))
        }
        return cookieValue
      },
      set: function(name, value, expires, path, domain, secure) {
        var cookieText = encodeURIComponent(name) + '=' + encodeURIComponent(value)
        if(expires instanceof Date) {
          cookieText += ';expires=' + expires.toGMTString()
        }
        if(path) {
          cookieText += ';path=' + path
        }
        if(domain) {
          cookieText += ';domain=' + domain
        }
        if(secure) {
          cookieText += ';secure=' + secure
        }
        document.cookie = cookieText
      },
      unset: function(name, path, domain, secure) {
        this.set(name, "", new Date(0), path, domain, secure)
      }
    }

4. call, apply, bind

深入浅出妙用 Javascript 中 apply、call、bind
apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;
apply 、 call 、bind 三者第一个参数都是this要指向的对象,也就是想指定的上下文;
apply 、 call 、bind 三者都可以利用后续参数传参;
bind 是返回对应函数,便于稍后调用;apply 、call 则是立即调用

5. prototype记录(关于是否会修改原值有些混乱,待整理)

Js 数组——filter()、map()、some()、every()、forEach()、lastIndexOf()、indexOf()
Array.prototype.valueOf()
Array.prototype.toString() //toLocaleString,使用本地分隔字符
Array.prototype.concat(args/array)
Array.prototype.join(seperate)
Array.prototype.shift() //返回删除的第一项,原arr被修改
Array.prototype.pop() //返回删除的最后一项,原arr被修改
Array.prototype.push(args) //往数组后面添加,返回添加后的arr长度,原arr被修改
Array.prototype.unshift(args) //往数组前面添加,返回添加后的arr长度,原arr被修改
Array.prototype.reverse() //原arr被修改
Array.prototype.sort() //原arr被修改
Array.prototype.forEach(function)

Array.prototype.map(function) //返回新的数组,不修改原arr,function(x)直接return对数组元素x的操作

var str = '12345';
Array.prototype.map.call(str, function(x) {
  return x;
}).reverse().join(''); //等同str.split('').reverse().join(''),原str不会被修改

// Output: '54321'
// Bonus: use '===' to test if original string was a palindrome判断回文

Array.prototype.filter(function) //function(x)直接return满足条件的x(条件式)
Array.prototype.some(function) //若array中有一项满足function中的表达式,则返回true
Array.prototype.every(function) //array中的每一项满足function中的表达式才返回true
Array.prototype.reduce(function, x) //其中x为参数传入function(x, y),遍历数组元素y,累加器

var sum = [0, 1, 2, 3].reduce(function(acc, val) {
  return acc + val;
}, 0);
// sum is 6

//展开数组嵌套
var list1 = [[0, 1], [2, 3], [4, 5]];
var list2 = [0, [1, [2, [3, [4, [5]]]]]];

const flatten = arr => arr.reduce(
  (acc, val) => acc.concat(
    Array.isArray(val) ? flatten(val) : val
  ),
  []
);
flatten(list1); // returns [0, 1, 2, 3, 4, 5]
flatten(list2); // returns [0, 1, 2, 3, 4, 5]

Array.protorype.slice(start, end) //[start, end),start和end可为负,start和end可为空,不修改原arr,返回新字符串
Array.prototype.splice(start, deleteNum, insertArgs) //deleteNum可为空,如果有删除项返回删除项,原arr被修改

参数数组化,相当于...args
function list() {
  return Array.prototype.slice.call(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]

var unboundSlice = Array.prototype.slice;
var slice = Function.prototype.call.bind(unboundSlice);
function list() {
  return slice(arguments);
}
var list1 = list(1, 2, 3); // [1, 2, 3]

String.prototype.replace(被取代的,新的) //返回新字符串
String.prototype.substr(start, length) //表示从start(可为负)开始截取length长度,返回新字符串
String.prototype.substring(start, end) //[start, end),start和end不可为负,但可以调换位置,小值为start,大值为end,返回新字符串

6. 简单记录一下各类型的判定

function isNumber(obj) {
  return obj!== undefined && typeof(obj) === 'number' && !isNaN(obj);
}

Array.isArray(arr)

Math.pow(x, y) //x的y次幂

JS trick

In JavaScript, why is “0” equal to false, but when tested by 'if' it is not false by itself?

相关文章

网友评论

      本文标题:js notebook

      本文链接:https://www.haomeiwen.com/subject/gxicgttx.html