Java Script 笔记2

163 阅读9分钟

11 数组迭代

forEach() 方法为每个数组元素调用一次函数(回调函数)。

var txt = "";
var numbers = [45, 4, 9, 16, 25];
numbers.forEach(myFunction);

function myFunction(value(值), index(索引), array(本身)) {
  txt = txt + value + "<br>"; 
}

结果为:45 4 9 16 25

11.1 Array.reduce()

reduce() 方法在每个数组元素上运行函数,以生成(减少它)单个值。

reduce() 方法在数组中从左到右工作。另请参见 reduceRight()。

reduce() 方法不会减少原始数组。

这个例子确定数组中所有数字的总和:

var numbers1 = [45, 4, 9, 16, 25];
var sum = numbers1.reduce(myFunction);

function myFunction(total, value, index, array) {
  return total + value;
}

结果为99

reduce() 方法能够接受一个初始值: var numbers1 = [45, 4, 9, 16, 25]; var sum = numbers1.reduce(myFunction, 100);

function myFunction(total, value) { return total + value; }

结果为199

12 创建 Date 对象

Date 对象由新的 Date() 构造函数创建。

有 4 种方法创建新的日期对象:

new Date() new Date(year(年), month(月), day(日), hours(小时), minutes(分钟), seconds(秒), milliseconds(毫秒)) new Date(milliseconds) new Date(date string)

5个数字指定年、月、日、小时和分钟(以此类推):

var d = new Date(2018, 11, 24, 10, 33);

12.1 显示日期

JavaScript(默认情况下)将以全文本字符串格式输出日期:


d = new Date();
document.getElementById("demo").innerHTML = d;

会显示当前中国标准时间

toUTCString() 方法将日期转换为 UTC 字符串(一种日期显示标准)。

var d = new Date();
document.getElementById("demo").innerHTML = d.toUTCString();

结果为 Wed, 14 Apr 2021 08:20:45 GMT

toDateString() 方法将日期转换为更易读的格式:

var d = new Date();
document.getElementById("demo").innerHTML = d.toDateString();

结果为Wed Apr 14 2021

13 数学

Math.pow(x, y) 的返回值是 x 的 y 次幂:

Math.pow(8, 2); // 返回 64

Math.sqrt(x) 返回 x 的平方根:

Math.sqrt(64);      // 返回 8

Math.abs(x) 返回 x 的绝对(正)值:


Math.abs(-4.7);     // 返回 4.7

Math.ceil(x) 的返回值是 x 上舍入最接近的整数:

Math.ceil(6.4);     // 返回 7

Math.floor(x) 的返回值是 x 下舍入最接近的整数:

Math.floor(2.7);    // 返回 2

14 随机

Math.random( )
Math.random( ) 返回 0(包括) 至 1(不包括) 之间的随机数:

JavaScript 随机整数 Math.random() 与 Math.floor() 一起使用用于返回随机整数。

Math.floor(Math.random() * 10);	//返回 0 至 9 之间的数
Math.floor(Math.random() * 11);		// 返回 0 至 10 之间的数
Math.floor(Math.random() * 100);	// 返回 0 至 99 之间的数
Math.floor(Math.random() * 10) + 1;	// 返回 1 至 10 之间的数

一个适当的随机函数 正如你从上面的例子看到的,创建一个随机函数用于生成所有随机整数是一个好主意。

这个 JavaScript 函数始终返回介于 min(包括)和 max(不包括)之间的随机数:

function getRndInteger(min, max) {
    return Math.floor(Math.random() * (max - min) ) + min;
}

这个 JavaScript 函数始终返回介于 min 和 max(都包括)之间的随机数:

function getRndInteger(min, max) {
    return Math.floor(Math.random() * (max - min + 1) ) + min;
}

15 逻辑

JavaScript 布尔(逻辑)代表两个值之一:true 或 false。

不要创建布尔对象。它会拖慢执行速度。

new 关键词会使代码复杂化,并产生某些意想不到的结果:

当使用 == 运算符时,相等的布尔是相等的

16 条件(三元)运算符

variablename(变量名称) = (condition(条件)) ? value1(值1):value2(值2)

如果将字符串与数字进行比较,那么在做比较时 JavaScript 会把字符串转换为数值。空字符串将被转换为 0。非数值字符串将被转换为始终为 false 的 NaN。

Snipaste_2021-04-14_17-25-59.png

17 条件

if语句 (语义:如果...就..)


if (条件) {
    如果条件为 true 时执行的代码
} 

if (hour < 18) {
    greeting = "Good day";
}

else语句(如果不..那么就..)


if (条件) {
    条件为 true 时执行的代码块
} else { 
    条件为 false 时执行的代码块
}

if (hour < 18) {
    greeting = "Good day";
 } else {
    greeting = "Good evening";
 } 

else if 语句(如果不....那么就...)有一个满足就行


if (条件 1) {
    条件 1true 时执行的代码块
} else if (条件 2) {
    条件 1false 而条件 2true 时执行的代码块
 } else {
    条件 1 和条件 2 同时为 false 时执行的代码块
}

if (time < 10) {
    greeting = "Good morning";
 } else if (time < 18) {
    greeting = "Good day";
 } else {
    greeting = "Good evening";
 } 

switch语句:选择多个需被执行的代码块之一。(相当于从中筛选多个,选择一个为ture)


switch(表达式) {
     case n:
        代码块
        break;
     case n:
        代码块
        break;
     default:
        默认代码块
} 


switch (new Date().getDay()) {
    case 0:
        day = "星期天";
        break;
    case 1:
        day = "星期一";
         break;
    case 2:
        day = "星期二";
         break;
    case 3:
        day = "星期三";
         break;
    case 4:
        day = "星期四";
         break;
    case 5:
        day = "星期五";
         break;
    case 6:
        day = "星期六";
} 

17.1 关键字

break 关键词 如果 JavaScript 遇到 break 关键词,它会跳出 switch 代码块。

此举将停止代码块中更多代码的执行以及 case 测试。

如果找到匹配,并完成任务,则随机中断执行(break)。无需更多测试。

break 能够节省大量执行时间,因为它会“忽略” switch 代码块中的其他代码的执行。

不必中断 switch 代码块中的最后一个 case。代码块在此处会自然结束。

default 关键词:default 关键词规定不存在 case 匹配时所运行的代码:


switch (new Date().getDay()) {
    case 6:
        text = "今天是周六";
        break; 
    case 0:
        text = "今天是周日";
        break; 
    default: 
        text = "期待周末~";
} 
   text 的结果是:

   期待周末~

Switching 的细节
如果多种 case 匹配一个 case 值,则选择第一个 case。

如果未找到匹配的 case,程序将继续使用默认 label。

如果未找到默认 label,程序将继续 switch 后的语句。

18 循环

JavaScript 支持不同类型的循环:

for - 多次遍历代码块

for (语句 1; 语句 2; 语句 3) {
     要执行的代码块
}
for (i = 0, len = cars.length, text = ""; i < len; i++) { 
    text += cars[i] + "<br>";
}

for/in - 遍历对象属性

var person = {fname:"Bill", lname:"Gates", age:62}; 

var text = "";
var x;
for (x in person) {
    text += person[x];
}

while - 当指定条件为 true 时循环一段代码块(只要条件为 true,循环能够一直执行代码块。)

如果忘了对条件中使用的变量进行递增,那么循环永不会结束。这会导致浏览器崩溃。


while (条件) {
    要执行的代码块
}

while (i < 10) {
    text += "数字是 " + i;
    i++;
}

do/while - 当指定条件为 true 时循环一段代码块
do/while 循环是 while 循环的变体。在检查条件是否为真之前,这种循环会执行一次代码块,然后只要条件为真就会重复循环。


do {
    要执行的代码块
}

while (条件)

do {
    text += "The number is " + i;
    i++;
 }
while (i < 10);

19 JavaScript Break 和 Continue

break 语句“跳出”循环。
continue 语句“跳过”循环中的一个迭代

break 语句会中断循环,并继续执行循环之后的代码(如果有):

for (i = 0; i < 10; i++) {
    if (i === 3) { break; }
    text += "数字是 " + i + "<br>";
}

continue 语句中断(循环中)的一个迭代,如果发生指定的条件。然后继续循环中的下一个迭代

本例跳过值 3 :

for (i = 0; i < 10; i++) {
    if (i === 3) { continue; }
    text += "数字是 " + i + "<br>";
} 

continue 语句(不论有无标签引用)只能用于跳过一个迭代。

break 语句,如果没有标签引用,只能用于跳出一个循环或一个 switch。

如果有标签引用,则 break 语句可用于跳出任意代码块:


var  cars = ["BMW", "Volvo", "Saab", "Ford"];
list: {
    text += cars[0] + "<br>"; 
    text += cars[1] + "<br>"; 
    text += cars[2] + "<br>"; 
    break list;
    text += cars[3] + "<br>"; 
    text += cars[4] + "<br>"; 
    text += cars[5] + "<br>"; 
}

结果为
BMW
Volvo

20 let

重新声明变量 使用 var 关键字重新声明变量会带来问题。

在块中重新声明变量也将重新声明块外的变量:


var x = 10;
// 此处 x 为 10
{ 
  var x = 6;
  // 此处 x 为 6
}
// 此处 x 为 6

使用let(块域)关键字重新声明变量可以解决这个问题。

在块中重新声明变量不会重新声明块外的变量:

var x = 10;
// 此处 x 为 10
{ 
  let x = 6;
  // 此处 x 为 6
}
// 此处 x 为 10

const(块域)但是您无法重新为常量数组赋值:

const PI = 3.141592653589793;
PI = 3.14;      // 会出错
PI = PI + 10;   // 也会出错
// 您可以创建 const 对象:
const car = {type:"porsche", model:"911", color:"Black"};

// 您可以更改属性:
car.color = "White";

// 您可以添加属性:
car.owner = "Bill";

21 表单验证

自动 HTML 表单验证

HTML 表单验证能够被浏览器自动执行:

如果表单字段(fname)是空的,required 属性防止表单被提交:

<form action="/action_page_post.php" method="post">
   <input type="text" name="fname" required>
   <input type="submit" value="Submit">
</form>

验证API

Snipaste_2021-04-14_22-42-16.png

checkValidity() 方法
如果输入字段包含无效的数据,显示一条消息:


<input id="id1" type="number" min="100" max="300" required(防止空表单提交)>
<button onclick="myFunction()">OK</button>

<p id="demo"></p>

<script>
 function myFunction() {
    var inpObj = document.getElementById("id1");
    if (inpObj.checkValidity()返回ture,则有效 == false) {
        document.getElementById("demo").innerHTML = inpObj.validationMessage;
    }
}
</script>

22 函数补充

22.1 JavaScript call() 方法

call() 方法是预定义的 JavaScript 方法。

它可以用来调用所有者对象作为参数的方法。

通过 call(),您能够使用属于另一个对象的方法。

本例调用 person 的 fullName 方法,并用于 person1:

var person = {
    fullName: function() {
        return this.firstName + " " + this.lastName;
    }
}
var person1 = {
    firstName:"Bill",
    lastName: "Gates",
}
var person2 = {
    firstName:"Steve",
    lastName: "Jobs",
}
person.fullName.call(person1);  // 将返回 "Bill Gates"

call() 方法可接受参数:

var person = {
  fullName: function(city, country) {
    return this.firstName + " " + this.lastName + "," + city + "," + country;
  }
}
var person1 = {
  firstName:"Bill",
  lastName: "Gates"
}
person.fullName.call(person1, "Seattle", "USA");

22.2 apply

在本例中,person 的 fullName 方法被应用到 person1:


var person = {
    fullName: function() {
        return this.firstName + " " + this.lastName;
    }
}
var person1 = {
    firstName: "Bill",
    lastName: "Gates",
}
person.fullName.apply(person1);  // 将返回 "Bill Gates"

call() 和 apply() 之间的区别 不同之处是:

call() 方法分别接受参数。

apply() 方法接受数组形式的参数。

如果要使用数组而不是参数列表,则 apply() 方法非常方便。

apply() 方法接受数组中的参数:


var person = {
  fullName: function(city, country) {
    return this.firstName + " " + this.lastName + "," + city + "," + country;
  }
}
var person1 = {
  firstName:"John",
  lastName: "Doe"
}
person.fullName.apply(person1, ["Oslo", "Norway"]);

22.3 在数组上模拟 max 方法

您可以使用 Math.max() 方法找到(数字列表中的)最大数字:

Math.max(1,2,3);  // 会返回 3

由于 JavaScript 数组没有 max() 方法,因此您可以应用 Math.max() 方法。

Math.max.apply(null, [1,2,3]); // 也会返回 3

注意

JavaScript 严格模式
在 JavaScript 严格模式下,如果 apply() 方法的第一个参数不是对象,则它将成为被调用函数的所有者(对象)。在“非严格”模式下,它成为全局对象。

22.4 闭包

JavaScript 变量属于本地或全局作用域。

全局变量能够通过闭包实现局部(私有)。

变量的生命周期

全局变量活得和您的应用程序(窗口、网页)一样久。

局部变量活得不长。它们在函数调用时创建,在函数完成后被删除。

JavaScript 嵌套函数
所有函数都有权访问全局作用域。

事实上,在 JavaScript 中,所有函数都有权访问它们“上面”的作用域。

JavaScript 支持嵌套函数。嵌套函数可以访问其上的作用域。

在本例中,内部函数 plus() 可以访问父函数中的 counter 计数器变量:


function add() {
    var counter = 0;
    function plus() {counter += 1;}
    plus();     
    return counter; 
}

23.作用域和全局变量,局部变量

23.1.作用域

1.javaScript作用域:就是代码名字(变量)在某个范围内起的作用和效果。

目的时为了提高程序的可靠性,更重要的时减少命名冲突

2.js的作用域(es6)之前:全局作用域 局部作用域

3.全局作用域:整个Script标签 或者是一个单独的JS文件

4.局部作用域(函数作用域)在函数内部就是局部作用域,这个代码的名字只在函数内部起效果和作用

23.2 全局变量和局部变量

根据作用域的不同,变量分两种

全局变量

1.在全局作用域下声明的变量叫做全局变量(函数外部定义的变量)

2.全局变量在代码的任何位置都可以使用

3.在全局作用域下var声明的变量时全局变量

4.特殊情况下,在函数内不使用var声明的的变量也是全局变量

局部变量

1.在局部作用域下声明的变量叫做局部变量(在函数内部定义的变量)

2.局部变量只能在该函数内部使用

3.在函数内部var声明的变量是局部变量

4.函数的形参实际上就是局部变量

** 作用域链**
内部函数访问外部函数的变量,采取的是链式查找的方式来决定取那个值 这种结构称为作用域链 就近原则

var num=10;
function(){
   var num=20;  
 function(){
   console.log(num);
}
  fn();
}
  fn();
 结果为20

24 预备解析 声明变量提升 函数提升


        // //1.案例一
        var num = 10;
        fun();
        function fun() {
            console.log(num);
            var num = 20;
        }
        // // // 预解析:
        var num;//声明变量提升
        function fun() {
            var num;//声明变量提升
            console.log(num);
            num = 20;
        }//函数提升
        num = 10;
        fn();
        // //结果为undefined
        // // //2.案例二
        var num = 10;
        function fn() {
            console.log(num);
            var num = 20;
            console.log(num);
        }
        fun();
        // // //预解析
        var num;//声明变量提升
        function fn() {
            var num;//声明变量提升
            console.log(num);
            num = 20;
            console.log(num);
        }//函数提升
        num = 10;
        fun()
        // // 结果都为undefined  20
        // // //3,案例三
        var a = 18;
        f1();
        function f1() {
            var b = 9;
            console.log(a);
            console.log(b);
            var a = "123";
        }
        // // //域解析
        var b;//声明变量提升
        function f1() {
            var b;//声明变量提升
            var a//声明变量提升
            b = 9;
            console.log(a);
            console.log(b);
            a = "123"
        }//函数提升
        nun = 18;
        f1();
        //undefined 9
        // // 案例四
        f1();
        console.log(c);
        console.log(b);
        console.log(a);
        function f1() {
            var a = b = c = 9;//相当于var a=9;b=9;c=9;
            console.log(a);
            console.log(b);
            console.log(c);
        }
        //域解析
        function f1() {
            var a;//声明变量提升
            a = 9;
            b = 9;
            c = 9;
            console.log(a);
            console.log(b);
            console.log(c);
        };//函数提升
        f1();
        console.log(c);
        console.log(b);
        console.log(a)//无法访问局部变量
        // 结果为 9 9 9 9 9 undefined