js notebook

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?

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

推荐阅读更多精彩内容