1.ES5中的新增方法

1.1 ES5 新增方法概述

ES5 中给我们新增了一些方法,可以很方便的操作数组或者字符串,这些方法主要包括:
1、数组方法
2、字符串方法
3、对象方法

1.2 数组方法

迭代(遍历)方法:forEach()、map()、filter()、some()、every();

forEach() 迭代(遍历) 数组

array.forEach(function(currentValue, index, arr))

1.currentValue:数组当前项的值
2.index:数组当前项的索引
3.arr:数组对象本身

<body><script>// forEach 迭代(遍历) 数组var arr = [1, 2, 3];var sum = 0;arr.forEach(function(value, index, array) {console.log('每个数组元素' + value);console.log('每个数组元素的索引号' + index);console.log('数组本身' + array);sum += value;})console.log(sum);</script>
</body>

filter() 筛选数组

array.filter(function(currentValue, index, arr))

filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素,主要用于筛选数组

注意它直接返回一个新数组

currentValue: 数组当前项的值
index:数组当前项的索引
arr:数组对象本身

<body><script>// filter 筛选数组var arr = [12, 66, 4, 88, 3, 7];var newArr = arr.filter(function(value, index) {// return value >= 20;return value % 2 === 0;});console.log(newArr);</script>
</body>

some() 查找数组中是否有满足条件的元素

array.some(function(currentValue, index, arr))

some() 方法用于检测数组中的元素是否满足指定条件. 通俗点 查找数组中是否有满足条件的元素

注意它返回值是布尔值, 如果查找到这个元素, 就返回true , 如果查找不到就返回false.

如果找到第一个满足条件的元素,则终止循环. 不在继续查找.
currentValue: 数组当前项的值
index:数组当前项的索引
arr:数组对象本身

<body><script>// some 查找数组中是否有满足条件的元素 // var arr = [10, 30, 4];// var flag = arr.some(function(value) {//     // return value >= 20;//     return value < 3;// });// console.log(flag);var arr1 = ['red', 'pink', 'blue'];var flag1 = arr1.some(function(value) {return value == 'pink';});console.log(flag1);// 1. filter 也是查找满足条件的元素 返回的是一个数组 而且是把所有满足条件的元素返回回来// 2. some 也是查找满足条件的元素是否存在  返回的是一个布尔值 如果查找到第一个满足条件的元素就终止循环</script>
</body>

filter 也是查找满足条件的元素 返回的是一个数组 而且是把所有满足条件的元素返回回来
some 也是查找满足条件的元素是否存在 返回的是一个布尔值 如果查找到第一个满足条件的元素就终止循环

如果查询数组中唯一的元素, 用some方法更合适,因为它找到这个元素,就不在进行循环,效率更高

<body><script>var arr = ['red', 'green', 'blue', 'pink'];// 1. forEach迭代 遍历// arr.forEach(function(value) {//     if (value == 'green') {//         console.log('找到了该元素');//         return true; // 在forEach 里面 return 不会终止迭代//     }//     console.log(11);// })// 如果查询数组中唯一的元素, 用some方法更合适,arr.some(function(value) {if (value == 'green') {console.log('找到了该元素');return true; //  在some 里面 遇到 return true 就是终止遍历 迭代效率更高}console.log(11);});// arr.filter(function(value) {//     if (value == 'green') {//         console.log('找到了该元素');//         return true; //  // filter 里面 return 不会终止迭代//     }//     console.log(11);// });</script>
</body>

在forEach 里面 return 不会终止迭代
在some 里面 遇到 return true 就是终止遍历 迭代效率更高
filter 里面 return 不会终止迭代

1.3 字符串方法

trim() 方法会从一个字符串的两端删除空白字符。

str.trim()

trim() 方法并不影响原字符串本身,它返回的是一个新的字符串。

<body><input type="text"> <button>点击</button><div></div><script>// trim 方法去除字符串两侧空格var str = '   an  dy   ';console.log(str);var str1 = str.trim();console.log(str1);var input = document.querySelector('input');var btn = document.querySelector('button');var div = document.querySelector('div');btn.onclick = function() {var str = input.value.trim();if (str === '') {alert('请输入内容');} else {console.log(str);console.log(str.length);div.innerHTML = str;}}</script>
</body>

1.4 对象方法

1.Object.keys() 用于获取对象自身所有的属性

Object.keys(obj)
效果类似 for…in
返回一个由属性名组成的数组

<body><script>// 用于获取对象自身所有的属性var obj = {id: 1,pname: '小米',price: 1999,num: 2000};var arr = Object.keys(obj);console.log(arr);arr.forEach(function(value) {console.log(value);})</script>
</body>
  1. Object.defineProperty() 定义新属性或修改原有的属性。

Object.defineProperty(obj, prop, descriptor)

Object.defineProperty() 第三个参数 descriptor 说明: 以对象形式 { } 书写
value: 设置属性的值 默认为undefined
writable: 值是否可以重写。true | false 默认为false
enumerable: 目标属性是否可以被枚举。true | false 默认为 false
configurable: 目标属性是否可以被删除或是否可以再次修改特性 true | false 默认为false

 Object.defineProperty(obj, 'address', {value: '中国山东蓝翔技校xx单元',// 如果只为false 不允许修改这个属性值 默认值也是falsewritable: false,// enumerable 如果值为false 则不允许遍历, 默认的值是 falseenumerable: false,// configurable 如果为false 则不允许删除这个属性 不允许在修改第三个参数里面的特性 默认为falseconfigurable: false});

2.函数进阶

2.1 函数的定义和调用

1.函数的定义方式

<body><script>//  函数的定义方式// 1. 自定义函数(命名函数) function fn() {};// 2. 函数表达式 (匿名函数)var fun = function() {};// 3. 利用 new Function('参数1','参数2', '函数体');var f = new Function('a', 'b', 'console.log(a + b)');f(1, 2);// 4. 所有函数都是 Function 的实例(对象)console.dir(f);// 5. 函数也属于对象console.log(f instanceof Object);</script>
</body>

注意:
1.Function 里面参数都必须是字符串格式
2.第三种方式执行效率低,也不方便书写,因此较少使用
3.所有函数都是 Function 的实例(对象)
4.函数也属于对象

2 .函数的调用
1.普通函数
this指向window

 function fn() {console.log('人生的巅峰');}fn();   //fn.call()

2.对象的方法
this指向对象o

 var o = {sayHi: function() {console.log('人生的巅峰');}}o.sayHi();

3.构造函数 this指向ldh这个实例对象
原型对象里的this也指向ldh这个实例对象

  function Star() {};var ldh = new Star();Star.prototype.sing = function() {}

4.绑定事件函数 指向调用者 btn这个按钮对象

btn.onclick = function() {};   // 点击了按钮就可以调用这个函数

5.定时器函数 this指向的是window对象

 window.setInterval(function() {}, 1000);  这个函数是定时器自动1秒钟调用一次

6.立即执行函数 this指向window

  (function() {console.log('人生的巅峰');})();// 立即执行函数是自动调用

2.2 this

1 .函数内this的指向
这些 this 的指向,是当我们调用函数的时候确定的。 调用方式的不同决定了this 的指向不同,一般指向我们的调用者.

2.改变函数内部this的指向
JavaScript 为我们专门提供了一些函数方法来帮我们更优雅的处理函数内部 this 的指向问题,常用的有 bind()、call()、apply() 三种方法。

1.call() 方法
call() 方法调用一个对象。简单理解为调用函数的方式,但是它可以改变函数的 this 指向。

fun.call(thisArg, arg1, arg2, …)

thisArg:在 fun 函数运行时指定的 this 值
arg1,arg2:传递的其他参数
返回值就是函数的返回值,因为它就是调用函数
因此当我们想改变 this 指向,同时想调用这个函数的时候,可以使用 call,比如继承

call 第一个可以调用函数 第二个可以改变函数内的this 指向
call 的主要作用可以实现继承 Father.call(this, uname, age, sex);

    <script>// 改变函数内this指向  js提供了三种方法  call()  apply()  bind()// 1. call()var o = {name: 'andy'}function fn(a, b) {console.log(this);console.log(a + b);};fn.call(o, 1, 2);// call 第一个可以调用函数 第二个可以改变函数内的this 指向// call 的主要作用可以实现继承function Father(uname, age, sex) {this.uname = uname;this.age = age;this.sex = sex;}function Son(uname, age, sex) {Father.call(this, uname, age, sex);}var son = new Son('刘德华', 18, '男');console.log(son);</script>

2. apply 方法

apply() 方法调用一个函数。简单理解为调用函数的方式,但是它可以改变函数的 this 指向。

fun.apply(thisArg, [argsArray])

thisArg:在fun函数运行时指定的 this 值
argsArray:传递的值,必须包含在数组里面
返回值就是函数的返回值,因为它就是调用函数
因此 apply 主要跟数组有关系,比如使用 Math.max() 求数组的最大值

 var arr = [1, 66, 3, 99, 4];var arr1 = ['red', 'pink'];// var max = Math.max.apply(null, arr);var max = Math.max.apply(Math, arr);var min = Math.min.apply(Math, arr);console.log(max, min);

3. bind 方法

bind() 方法不会调用函数。但是能改变函数内部this 指向

fun.bind(thisArg, arg1, arg2, …)

thisArg:在 fun 函数运行时指定的 this 值
arg1,arg2:传递的其他参数
返回由指定的 this 值和初始化参数改造的原函数拷贝
因此当我们只是想改变 this 指向,并且不想调用这个函数的时候,可以使用 bind

1.不会调用原来的函数 可以改变原来函数内部的this 指向
2.返回的是原函数改变this之后产生的新函数
3.如果有的函数我们不需要立即调用,但是又想改变这个函数内部的this指向此时用bind
4.我们有一个按钮,当我们点击了之后,就禁用这个按钮,3秒钟之后开启这个按钮
var btn1 = document.querySelector(‘button’);
btn1.onclick = function() {
this.disabled = true; // 这个this 指向的是 btn 这个按钮
// var that = this;
setTimeout(function() {
// that.disabled = false; // 定时器函数里面的this 指向的是window
this.disabled = false; // 此时定时器函数里面的this 指向的是btn
}.bind(this), 3000); // 这个this 指向的是btn 这个对象
}
4. call apply bind 总结

相同点:
都可以改变函数内部的this指向.
区别点:
call 和 apply 会调用函数, 并且改变函数内部this指向.
call 和 apply 传递的参数不一样, call 传递参数 aru1, aru2…形式 apply 必须数组形式[arg]
bind 不会调用函数, 可以改变函数内部this指向.
主要应用场景:
call 经常做继承.
apply 经常跟数组有关系. 比如借助于数学对象实现数组最大值最小值
bind 不调用函数,但是还想改变this指向. 比如改变定时器内部的this指向.

2.3 严格模式

1 .什么是严格模式
JavaScript 除了提供正常模式外,还提供了严格模式(strict mode)。ES5 的严格模式是采用具有限制性 JavaScript 变体的一种方式,即在严格的条件下运行 JS 代码。
严格模式在 IE10 以上版本的浏览器中才会被支持,旧版本浏览器中会被忽略。
严格模式对正常的 JavaScript 语义做了一些更改:
1.消除了 Javascript 语法的一些不合理、不严谨之处,减少了一些怪异行为。
2.消除代码运行的一些不安全之处,保证代码运行的安全。
3.提高编译器效率,增加运行速度。
4.禁用了在 ECMAScript 的未来版本中可能会定义的一些语法,为未来新版本的 Javascript 做好铺垫。比如一些保留字如:class, enum, export, extends, import, super 不能做变量名

2 开启严格模式
严格模式可以应用到整个脚本或个别函数中。因此在使用时,我们可以将严格模式分为为脚本开启严格模式和为函数开启严格模式两种情况。
1. 为脚本开启严格模式
为整个脚本文件开启严格模式,需要在所有语句之前放一个特定语句“use strict”;(或‘use strict’;)。
2. 为函数开启严格模式
要给某个函数开启严格模式,需要把“use strict”; (或 ‘use strict’; ) 声明放在函数体所有语句之前。

<body><!-- 为整个脚本(script标签)开启严格模式 --><script>'use strict';//   下面的js 代码就会按照严格模式执行代码</script><script>(function() {'use strict';})();</script><!-- 为某个函数开启严格模式 --><script>// 此时只是给fn函数开启严格模式function fn() {'use strict';// 下面的代码按照严格模式执行}function fun() {// 里面的还是按照普通模式执行}</script>
</body>

3.严格模式中的变化
1.变量规定

在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,变量都必须先用var 命令声明,然后再使用。
严禁删除已经声明变量。例如,delete x; 语法是错误的。

2. 严格模式下 this 指向问题
1.以前在全局作用域函数中的 this 指向 window 对象。
2.严格模式下全局作用域中函数中的 this 是 undefined。
3.以前构造函数时不加 new也可以 调用,当普通函数,this 指向全局对象
4.严格模式下,如果 构造函数不加new调用, this 指向的是undefined 如果给他赋值则 会报错
5.new 实例化的构造函数指向创建的对象实例。
6.定时器 this 还是指向 window 。
7.事件、对象还是指向调用者。

3. 函数变化
函数不能有重名的参数。
函数必须声明在顶层.新版本的 JavaScript 会引入“块级作用域”( ES6 中已引入)。为了与新版本接轨,不允许在非函数的代码块内声明函数。

2.4 高阶函数

高阶函数是对其他函数进行操作的函数,它接收函数作为参数或将函数作为返回值输出。

此时fn 就是一个高阶函数
函数也是一种数据类型,同样可以作为参数,传递给另外一个参数使用。 最典型的就是作为回调函数。
同理函数也可以作为返回值传递回来

<body><div></div><script>// 高阶函数- 函数可以作为参数传递function fn(a, b, callback) {console.log(a + b);callback && callback();}fn(1, 2, function() {console.log('我是最后调用的');});$("div").animate({left: 500}, function() {$("div").css("backgroundColor", "purple");})</script>
</body>

ES5新增方法、函数调用、this、严格模式、高阶函数(11th)相关推荐

  1. JavaScript 面向对象编程(三) —— 函数进阶 / 严格模式 / 高阶函数 / 闭包 / 浅拷贝和深拷贝

    本篇为 JavaScript 进阶 ES6 系列笔记第三篇,将陆续更新后续内容.参考:JavaScript 进阶面向对象 ES6 :ECMAScript 6 入门 系列笔记: JavaScript 面 ...

  2. 使用函数处理数组 高阶函数 js

    函数式编程 和lisp这种纯粹的函数式编程不一样,js可以实现其为函数式编程 使用函数处理数组 计算一个数组的平均值 // 定义一个用于计算和的函数 var sum = function(x, y){ ...

  3. Kotlin 使用高阶函数实现回调

    lambda 和 高阶函数 之前学习了 lambda 和高阶函数,然后在 android 开发中对 onClick 事件进行监听是一个很常用的功能,kotlin 的常规实现如下: rootView.s ...

  4. 【一天时间|JavaScript进阶】函数式编程高阶函数的应用

    一天时间系列文章是博主精心整理的面试热点问题和难点问题,吸收了大量的技术博客与面试文章,总结多年的面试经历,带你快速并高效地审视前端面试知识.直击技术痛点,主动出击,精密打击,这才是面试拿到高薪的秘诀 ...

  5. JavaScript 面向对象编程(二) —— 构造函数 / 原型 / 继承 / ES5 新增方法

    本篇为 JavaScript 进阶 ES6 系列笔记第二篇,将陆续更新后续内容.参考:JavaScript 进阶面向对象 ES6 :ECMAScript 6 入门 : Javascript 继承机制的 ...

  6. 继承与ES5新增方法

    1.继承 ES6之前并没有给我们提供 extends 继承.我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承. 1.1.call() 调用这个函数, 并且修改函数运行时的 this 指向 f ...

  7. JavaScript从入门到放弃 -(三)ES5新增方法及商品查询案例

    目录 1. ES5新增方法概述 2. 数组方法 2.1 forEach方法 2.2 filter 筛选数组方法 2.3 some方法 3. 查询商品案例 3.1 HTML结构和CSS样式 3.2 准备 ...

  8. 高级JavaScript Day03 | 函数定义和调用、this、严格模式、高阶函数、闭包、递归

    1.函数的定义和调用 1.1 函数的定义方式 1.函数的声明方式 function关键字 (命名函数) // 1. 自定义函数(命名函数)function fn() {}; 2.函数表达式 (匿名函数 ...

  9. 【JavaScript 笔记】— 函数高级(变量作用域、解构赋值、方法、高阶函数、闭包、箭头函数、generator)

    JavaScript个人笔记 变量作用域 变量提升 全局对象 windows 命名空间 局部作用域 常量 解构赋值 使用场景 方法 apply 装饰器 高阶函数(Array) map reduce m ...

最新文章

  1. CS 就业寒冬?这里有一份面试必备基础知识
  2. 尾递归调用 高阶函数 map filter reduce
  3. C#如何控制方法的执行时间,超时则强制退出方法执行
  4. jQuery 图片滚动效果
  5. 二叉树已知先序和中序输出后序
  6. linux内核之旅ppt_一起玩转 Linux 内核之旅开源社区吧
  7. 夸克、QQ浏览器、简单搜索竞品分析报告
  8. 56 FI配置-财务会计-固定资产-资产数据传输-定义历史数据传输的抵销科目
  9. 计算机语言系统不支持,win7电脑安装IE8出现“此安装不支持您的操作系统的当前语言”怎么办...
  10. Illustrator 教程,如何在 Illustrator 中添加图像?
  11. 142.PHP session 阻塞问题
  12. Win7 网络连接正常 无法上网
  13. Ruby中对应PHP的hex2bin和bin2hex方法
  14. 【AAAI-2019】论文整理(清单)
  15. 解决Chrome浏览器无法加载flash插件的问题
  16. 用JS 输出 正三角形
  17. 【Unity入门】3.3D物体
  18. 像个黑客一样在网络上来无影去无踪之IP代理理论篇
  19. 数据抓取 | 数据分享 - 北京链家二手房成交数据抓取,保存格式为excel
  20. IOS10-IOS13屏蔽系统更新描述文件|去除‘设置’①小红点教程

热门文章

  1. STM32第七课(TIM,HAL)
  2. Objective-C开发图书推荐
  3. Vue之this.$route.query和this.$route.params的使用与区别
  4. 定义圆类和圆柱类,打印圆的体积
  5. 帝国CMS (EmpireCMS)
  6. 【链表】双向循环链表的实现
  7. 卓胜微:国产替代泡沫破灭
  8. 水星MW4530R刷机总结
  9. 种花问题(Python)
  10. JSONObject 与 JSONArray