web基础03-JavaScript

目录

一、JavaScript基础

1.变量

2.输出

3.变量提升

4.区块

5.JavaScript数据类型

6.查看数值类型

7.undefined和null

8.布尔值

9.===和==的区别

10.算数/三元/比较/逻辑/赋值运算符

11.特殊字符

12.字符串

(1)获取字符串长度

(2)字符串连接

(3)不可变性

13.条件语句

14.循环语句

15.标签

16.函数

17.作用域

18.变量生命周期

19.弹窗

(1)Alert 警告框

(2)prompt提示框

(3)confirm确认框

20.对象

21.数组

(1)创建

(2)访问

(3)内置属性

(4)内置方法

①添加

②删除

③连接数组

④遍历

⑤查找

⑥切片

⑦关联数组

22.常用对象

(1)String

(2)Window对象

(3)JSON

(4)Math 对象

(5)Date 对象

(6)DOM

①元素选择

②改变属性

③添加/移除/替换元素

23.动画

24.事件

(1)事件监听


一、JavaScript基础

详细内容网上搜吧

JavaScript区分大小写

1.变量

声明变量

var 变量名;

如果没有在 var 声明语句中给 变量指定初始值, 在 变量 存入一个值之前,其初始值为 undefined。

给变量赋值

使用赋值运算符 ‘=’

变量名命名规则

  • 由字母、数字、下划线、$符号组成,不能以数字开头

  • 不能是关键字和保留字,例如:for,while,this,name

  • 区分大小写

  • 不能是算数运算符

  • 不允许使用连字符(-),它被保留用于减法。

保留字:

img

变量名命名规范

  • 变量名必须有意义

  • 遵守驼峰命名法

  • 不建议使用$作为变量名

2.输出

JavaScript 没有任何打印或者输出的函数。

JavaScript 可以通过以下几种方式来输出数据:

  • 使用 document.write() 方法将内容写到 HTML 文档中。

  • 使用 window.alert() 弹出警告框。

  • 使用 innerHTML 写入到 HTML 元素。

  • 使用 console.log() 写入到浏览器的控制台。

可以使用HTML标签来格式化JavaScript中的文本。

如:

<script>
    document.write("test");
    document.write("<h1>test</h1>");
</script>

3.变量提升

JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。

console.log(a);
​​​​​​​var a = 1;

上面代码首先使用console.log方法,在控制台(console)显示变量a的值。这时变量a还没有声明和赋值,所以这是一种错误的做法,但是实际上不会报错。因为存在变量提升,真正运行的是下面的代码。

var a;console.log(a);
a = 1;

最后的结果是显示undefined,表示变量a已声明,但还未赋值。

4.区块

JavaScript 使用大括号,将多个相关的语句组合在一起,称为“区块”(block)。

对于var命令来说,JavaScript 的区块不构成单独的作用域(scope)。

{  var a = 1;
}
a // 1

上面代码在区块内部,使用var命令声明并赋值了变量a,然后在区块外部,变量a依然有效,区块对于var命令不构成单独的作用域,与不使用区块的情况没有任何区别。在 JavaScript 语言中,单独使用区块并不常见,区块往往用来构成其他更复杂的语法结构,比如for、if、while、function等

5.JavaScript数据类型

JavaScript 有五种基本数据类型:

  • 字符串(string):字符串可以是引号中的任意文本。您可以使用 单引号双引号

    • 使用单引号括起来的字符串中,如果要包含单引号须使用反斜杠(\)转义处理字符串中的单引号

    • 使用双引号括起来的字符串中,如果要包含双引号须使用反斜杠(\)转义处理字符串中的双引号

    • 可以使用索引位置来访问字符串中的每个字符,索引从0开始

  • 数字(number):JavaScript 只有一种数值类型。

    • 数值可以带小数点,也可以不带,

    • 极大或极小的数字可以通过科学(指数)计数法来书写:

  • 布尔(boolean):只有false和true两个值

  • 空(null)

  • 未定义(undefined)

  • 对象(object):一种复杂数据类型:

JavaScript 中的变量是没有类型的,只有值才有。变量可以随时持有任何类型的值。

ES6还有个symbol的基本数据类型

6.查看数值类型

使用typeof 运算符

我们可以用 typeof 运算符来查看值得类型,它返回的是类型的字符串值。

typeof(123)

特殊:null类型

7.undefined和null

null与undefined都可以表示“没有”,含义非常相似。将一个变量赋值为undefined或null,老实说,语法效果几乎没区别。

var a = undefined;
// 或者
var a = null;

上面代码中,变量a分别被赋值为undefined和null,这两种写法的效果几乎等价。

在if语句中,它们都会被自动转为false,相等运算符(==)甚至直接报告两者相等。

if (!undefined) {  
    console.log('undefined is false');
}// undefined is false
if (!null) {  
    console.log('null is false');
}// null is false   
undefined == null// true

从上面代码可见,两者的行为是何等相似!谷歌公司开发的 JavaScript 语言的替代品 Dart 语言,就明确规定只有null,没有undefined!

既然含义与用法都差不多,为什么要同时设置两个这样的值,这不是无端增加复杂度,令初学者困扰吗?这与历史原因有关。

1995年 JavaScript 诞生时,最初像 Java 一样,只设置了null表示"无"。根据 C 语言的传统,null可以自动转为0。

Number(null) 
// 0
5 + null 
// 5

上面代码中,null转为数字时,自动变成0。

但是,JavaScript 的设计者 Brendan Eich,觉得这样做还不够。首先,第一版的 JavaScript 里面,null就像在 Java 里一样,被当成一个对象,Brendan Eich 觉得表示“无”的值最好不是对象。其次,那时的 JavaScript 不包括错误处理机制,Brendan Eich 觉得,如果null自动转为0,很不容易发现错误。

因此,他又设计了一个undefined。区别是这样的:null是一个表示“空”的对象,转为数值时为0;undefined是一个表示"此处无定义"的原始值,转为数值时为NaN。

Number(undefined) 
// NaN
5 + undefined 
// NaN

用法和含义

对于null和undefined,大致可以像下面这样理解。

null表示空值,即该处的值现在为空。调用函数时,某个参数未设置任何值,这时就可以传入null,表示该参数为空。比如,某个函数接受引擎抛出的错误作为参数,如果运行过程中未出错,那么这个参数就会传入null,表示未发生错误。

undefined表示“未定义”,下面是返回undefined的典型场景。

// 变量声明了,但没有赋值var i;
i // undefined// 调用函数时,应该提供的参数没有提供,该参数等于 undefinedfunction f(x) {  return x;
}
f() // undefined// 对象没有赋值的属性var  o = new Object();
o.p // undefined// 函数没有返回值时,默认返回 undefinedfunction f() {}
f() // undefined

8.布尔值

布尔值代表“真”和“假”两个状态。“真”用关键字true表示,“假”用关键字false表示。布尔值只有这两个值。

下列运算符会返回布尔值:

  • 两元逻辑运算符: && (And),|| (Or)

  • 前置逻辑运算符: ! (Not)

  • 相等运算符:===,!==,==,!=

  • 比较运算符:>,>=,<,<=

如果 JavaScript 预期某个位置应该是布尔值,会将该位置上现有的值自动转为布尔值。转换规则是除了下面六个值被转为false,其他值都视为true。

  • undefined

  • null

  • false

  • 0

  • NaN

  • ""或''(空字符串)

布尔值往往用于程序流程的控制,请看一个例子。

if ('') {  
    console.log('true');
}// 没有任何输出

上面代码中,if命令后面的判断条件,预期应该是一个布尔值,所以 JavaScript 自动将空字符串,转为布尔值false,导致程序不会进入代码块,所以没有任何输出。

注意,空数组([])和空对象({})对应的布尔值,都是true。

if ([]) {  
    console.log('true');
}// true
if ({}) {  
    console.log('true');
}// true

9.===和==的区别

==:非严格相等

  1. 如果操作数具有相同的类型,则按如下方式进行比较:

    • 对象(Object):仅当两个操作数引用同一个对象时返回 true。

    • 字符串(String):只有当两个操作数具有相同的字符且顺序相同时才返回 true。

    • 数值(Number):如果两个操作数的值相同,则返回 true。+0 和 -0 被视为相同的值。如果任何一个操作数是 NaN,返回 false;所以,NaN 永远不等于 NaN。

    • 布尔值(Boolean):仅当操作数都为 true 或都为 false 时返回 true。

    • 大整形(BigInt):仅当两个操作数值相同时返回 true。

    • 符号(Symbol):仅当两个操作数引用相同的符号时返回 true。

  2. 如果其中一个操作数为 null 或 undefined,另一个操作数也必须为 null 或 undefined 以返回 true。否则返回 false。

  3. 如果其中一个操作数是对象,另一个是基本类型,按此顺序使用对象的 @@toPrimitive()(以 "default" 作为提示),valueOf() 和 toString() 方法将对象转换为基本类型。(这个基本类型转换与相加中使用的转换相同。)

  4. 在这一步,两个操作数都被转换为基本类型(String、Number、Boolean、Symbol 和 BigInt 中的一个)。其余的转换是逐个进行的。

    • 如果是相同的类型,使用步骤 1 进行比较。

    • 如果其中一个操作数是 Symbol 而另一个不是,返回 false。

    • 如果其中一个操作数是布尔型而另一个不是,则将布尔型转换为数字:true 转换为 1,false 转换为 0。然后再次松散地比较两个操作数。

    • Number to String:使用与 Number() 构造函数相同的算法将字符串转换为数字。转换失败将导致 NaN,这将保证相等是 false。

    • Number to BigInt:按数值进行比较。如果数值为 ±∞ 或 NaN,返回 false。

    • String to BigInt:使用与 BigInt() 构造函数相同的算法将字符串转换为 BigInt。如果转换失败,返回 false。

宽松相等是对称的:A == B 对于 A 和 B 的任何值总是具有与 B == A 相同的语义(应用转换的顺序除外)。

===:严格相等

  • 如果操作数的类型不同,则返回 false。

  • 如果两个操作数都是对象,只有当它们指向同一个对象时才返回 true。

  • 如果两个操作数都为 null,或者两个操作数都为 undefined,返回 true。

  • 如果两个操作数有任意一个为 NaN,返回 false。

  • 否则,比较两个操作数的值:

    • 数字类型必须拥有相同的数值。+0 和 -0 会被认为是相同的值。

    • 字符串类型必须拥有相同顺序的相同字符。

    • 布尔运算符必须同时为 true 或同时为 false。

10.算数/三元/比较/逻辑/赋值运算符

同Java

比较运算符:

img

赋值运算符:

img

11.特殊字符

代码输出
'单引号
"双引号
\反斜杠
\n换行
\r回车
\ttab(制表符)
\b退格符
\f换页符

12.字符串

(1)获取字符串长度

使用内置属性 length 来计算字符串的长度

(2)字符串连接

使用‘’+‘’来连接

(3)不可变性

在 JavaScript 中,字符串 的值是 不可变的,这意味着一旦字符串被创建就不能被改变。

13.条件语句

同Java

14.循环语句

同java

15.标签

JavaScript 语言允许,语句的前面有标签(label),相当于定位符,用于跳转到程序的任意位置,标签的格式如下。

label:
  语句

标签可以是任意的标识符,但不能是保留字,语句部分可以是任意语句。

标签通常与break语句和continue语句配合使用,跳出特定的循环。

top:  
for (var i = 0; i < 3; i++){    
    for (var j = 0; j < 3; j++){       
        if (i === 1 && j === 1) break top;         
        console.log('i=' + i + ', j=' + j);
    }
}// i=0, j=0// i=0, j=1// i=0, j=2// i=1, j=0

上面代码为一个双重循环区块,break命令后面加上了top标签(注意,top不用加引号),满足条件时,直接跳出双层循环。如果break语句后面不使用标签,则只能跳出内层循环,进入下一次的外层循环。

标签也可以用于跳出代码块。

foo: {  
    console.log(1);  
    break foo;
    console.log('本行不会输出');
}
console.log(2);// 1// 2

上面代码执行到break foo,就会跳出区块。

continue语句也可以与标签配合使用。

top:  
for (var i = 0; i < 3; i++){    
    for (var j = 0; j < 3; j++){      
        if (i === 1 && j === 1) continue top;      
        console.log('i=' + i + ', j=' + j);
    }
}// i=0, j=0// i=0, j=1// i=0, j=2// i=1, j=0// i=2, j=0// i=2, j=1// i=2, j=2

上面代码中,continue命令后面有一个标签名,满足条件时,会跳过当前循环,直接进入下一轮外层循环。如果continue语句后面不使用标签,则只能进入下一轮的内层循环。

16.函数

JavaScript函数是用于执行特定任务的代码块。

  • 主要作用:代码重用,使用不同的参数多次使用相同的代码,以产生不同的结果。

与Java方法类似,参数不需要对类型进行声明。

要执行函数,您需要调用它。

要调用函数,从函数的名称开始,然后使用括号中的参数。

根据需求决定调用次数

function fName(param01,param02) {
      return param01+param02;
}
fName(123,154);

显式参数和隐式参数:

函数显式参数在函数定义时列出。

函数隐式参数(arguments)是函数调用时传递给函数真正的值。

function sum(){
    return arguments[0]+arguments[1];
}
sum(1, 2);//3

函数参数规则:

  • JavaScript 函数定义时参数没有指定数据类型。

  • JavaScript 函数对隐藏参数(arguments)没有进行检测。

  • JavaScript 函数对隐藏参数(arguments)的个数没有进行检测。

注意:

  • 分号是用来分隔可执行JavaScript语句。

  • 由于函数声明不是一个可执行语句,所以不以分号结束。

  • 如果使用缺少参数(少于声明数)调用函数,则将缺少的值为undefined,这表示未为变量赋值。

return:

return 语句在函数中是可选的。它用于从函数返回值。

当JavaScript执行完 return 语句时,该函数停止执行。

如果没有从函数返回任何东西,它将返回 undefined

17.作用域

作用域是可访问变量的集合。

JavaScript 中, 对象函数同样也是变量。

JavaScript 中, 作用域为可访问变量,对象,函数的集合。

JavaScript 函数作用域: 作用域在函数内修改。

JavaScript 局部作用域

变量在函数内声明,变量为局部作用域。

局部变量:只能在函数内部访问。

// 此处不能调用 carName 变量
function myFunction() {
    var carName = "大众";
    // 函数内可调用 carName 变量
}

因为局部变量只作用于函数内,所以不同的函数可以使用相同名称的变量。

局部变量在函数开始执行时创建,函数执行完后局部变量会自动销毁

局部变量的优先级高于同名的全局变量。

// 声明 全局carName
var carName = '奔驰';
function myFunction() {
    var carName = "大众";
    document.write(carName); // carName 值为 大众
}

变量在函数外定义,即为全局变量。

全局变量有 全局作用域: 网页中所有脚本和函数均可使用。

如果变量在函数内没有声明(没有使用 var 关键字),该变量为全局变量。

注意:

没有使用var关键字定义的变量,会被自动创建在全局作用域中,变成全局变量。当在代码其他地方无意间定义了一个变量,刚好变量名与全局变量相同,这时候会产生意想不到的后果,可能导致你的代码出现BUG。最好使用 var 关键字来声明变量。

18.变量生命周期

JavaScript 变量生命周期在它声明时初始化。

局部变量在函数执行完毕后销毁。

全局变量在页面关闭后销毁。

函数参数只在函数内起作用,是局部变量。

19.弹窗

JavaScript提供三种类型的弹出框,Alert, Prompt,Confirm

(1)Alert 警告框

当弹出警报框时,用户必须单击“确定”继续。

警报功能采用单个参数,即弹出框中显示的文本。

使用 alert 弹出框,将阻塞整个页面的运行,点击确定后才继续运行.

(2)prompt提示框

通常使用提示框来让用户输入一个值。

当弹出提示框时,输入输入值后,用户将不得不单击“确定”或“取消”继续。

如果用户单击确定,该框将返回输入值。如果用户单击取消,该框将返回null。

prompt() 方法有两个参数

- 第一个是要在文本框中显示的标签。

- 第二个是在文本框中显示的默认字符串(可选)。

(3)confirm确认框

经常使用 confirm 让用户验证或接受某些内容。

当弹出确认框时,用户必须单击“确定”或“取消”继续。

如果用户单击确定,该框将返回 true。如果用户单击取消,该框将返回 false

20.对象

JavaScript 对象是拥有属性和方法的数据。

JavaScript 中一切皆对象:字符串、数值、数组、函数...

JavaScript 也允许自定义对象。

JavaScript 提供多个内建对象,比如 String、Date、Array 等等。 对象只是带有属性和方法的特殊数据类型。

  • 布尔型可以是一个对象。

  • 数字型可以是一个对象。

  • 字符串也可以是一个对象

  • 日期是一个对象

  • 数学和正则表达式也是对象

  • 数组是一个对象

  • 甚至函数也可以是对象

你可以使用字符来定义和创建 JavaScript 对象:

var person = {
 name: "John", age: 31, 
 favColor: "green", height: 183
};

定义 JavaScript 对象可以跨越多行,空格跟换行不是必须的。

img

访问对象属性:

您可以通过两种方式访问对象属性。

objectName.propertyName
//或者
objectName['propertyName']

这个例子使用了两种方式访问 person 的年龄

var person = {
 name: "John", age: 31, 
 favColor: "green", height: 183
};
var x = person.age;
var y = person['age'];

JavaScript的内置长度属性用于计算属性或字符串中的字符数。

var course = {name: "JS", lessons: 54};
document.write(course.name.length);
// -> 2

两种方式访问对象属性的区别:

  • 点方法后面跟的必须是一个指定的属性名称,而中括号方法里面可以是变量。例如

var haha = "name";
console.log(obj.haha); // undefined
console.log(obj[haha]); // cedric
  • 中括号方法里面的属性名可以是数字,而点方法后面的属性名不可以是数字

  • 当动态为对象添加属性时,必须使用中括号[],不可用点方法

当你创建了一个对象后,你可以用.或[]来更新对象的属性。

var ourDog = {"name": "Camper","legs": 4,"tails": 1,"friends": ["everything!"]};
ourDog.name = "Happy Camper";
ourDog["name"] = "Happy Camper";

你也可以像更改属性一样给对象添加属性。

删除属性:

var ourDog = {
"name": "Camper",
"legs": 4,
"tails": 1,
"friends": ["everything!"]
};
​
var c1 = ourDog['tails']; // c1 等于 1
// 删除 tails 属性
delete ourDog['tails']; // 等价于 delete ourDog.tails
var c2 = ourDog['tails']; // c2 等于 undefined

对象方法

对象方法是一个包含函数定义的属性。

您可以通过以下语法来调用方法:

对象名.方法名()

这个例子使用了 String 对象的 toUpperCase() 方法来将文本转换为大写:

var message = "Hello world!";
var x = message.toUpperCase();

在以上代码执行后,x 的值将是:

HELLO WORLD!

提示: 方法是作为对象属性存储的函数。

使用 [] 读取对象属性

var myObj = {
"name": "Loen",
"age": "28",
"eat": function(){
    return "I'm eating";
}
};
​
myObj["name"]; // Loen
​
var a = 'age';
myObj[a]; // 还可以用变量访问对象属性, 这里返回 28
​
myObj['eat'](); // 返回 I'm eating

对象构造器

使用函数来构造对象:

function person(firstname, lastname, age, eyecolor){
    this.firstname = firstname;
    this.lastname = lastname;
    this.age = age;
    this.eyecolor = eyecolor;
}

在JavaScript中,this通常指向的是我们正在执行的函数本身,或者是指向该函数所属的对象(运行时)

一旦有了对象构造器,就可以创建新的对象实例,同Java

初始化

使用英文大括号{}创建单个对象:var John = {name: "John", age: 25};

方法

方法是存储在对象属性中的函数。

使用以下方式创建对象函数:

methodName : function() { code lines }

使用以下方式访问对象函数:

objectName.methodName()

this 关键词是当前对象的引用,这意味着您可以使用 this 来访问对象属性和方法。

在构造函数中定义方法:

function person(name, age) {
  this.name = name;  
  this.age = age;
  this.changeName = function (name) {
    this.name = name;
  }
}
​
var p = new person("Loen", 28);
p.changeName("John");

在上面的示例中,我们定义了一个名为 changeName 的方法,该方法是一个函数,它接受参数名称并将其分配给对象的 name 属性。

你也可以在构造函数外部定义一个函数,通过函数名关联到对象的属性上:

function person(name, age) {
  this.name= name;  
  this.age = age;
  this.yearOfBirth = bornYear; // 关联 bornYear 函数
}
function bornYear() {
  return new Date().getFullYear() - this.age; 
}

以上代码中 new Date().getFullYear() 是获取今年完整的年份时间 如:2017 , 如您所见,我们已将对象的 yearOfBirth 属性赋予 bornYear 函数。当通过对象调用 bornYear 函数时, bornYear 函数中 this 指向这个对象。

将函数关联到对象属性时不需要写括号。

方法的调用

function person(name, age) {
  this.name= name;  
  this.age = age;
  this.yearOfBirth = bornYear;
}
function bornYear() {
  return new Date().getFullYear() - this.age;
}
​
var p = new person("Loen", 29);
document.write(p.yearOfBirth());

21.数组

(1)创建
var mycars = new Array("Saab","Volvo","BMW");

动态创建

JavaScript数组是动态的,所以你可以声明一个数组,不给 Array() 构造函数传递任何参数。然后可以动态添加元素。

var mycars = new Array();
mycars[0] = "Saab";
mycars[1] = "Volvo";
mycars[2] = "BMW";
mycars[3] = "Lincoln";

字面量创建(常用):

为了更大的简单性,可读性和执行速度,您还可以使用数组字面量语法来声明数组。

var mycars = ["Saab", "Volvo", "BMW"]; 

声明方式和使用 new Array() 方式创建的数组相同.

(2)访问

通过指定数组名以及索引号码,你可以访问某个特定的元素。

尝试访问数组以外的索引,返回值 undefined

索引从0开始

(3)内置属性

数组的 length 属性返回它的元素的数量。

数组为空则length属性的值为0

(4)内置方法
①添加

push() 方法

在数组末尾增加一个或多个元素:

在数组尾部压入一个元素与给数组 a[a.length]赋值是一样的.

unshift() 方法

你不仅可以 shift(移出)数组中的第一个元素,你也可以 unshift(移入)一个元素到数组的头部。

.unshift() 方法用起来就像 .push() 方法一样, 但不是在数组的末尾添加元素,而是在数组的头部添加元素。

②删除

pop() 方法

改变数组中数据的另一种方法是用 .pop() 方法。

.pop() 方法用来删除(“抛出”)一个数组末尾的值。

我们可以把这个删除(“抛出”)的值赋给一个变量存储起来。

数组中任何类型的数据条目(数值,字符串,甚至是数组)可以被“抛出来” 。

shift() 方法

.pop() 方法用来移出数组中最后一个元素。如果想要移出数组第一个元素要怎么办呢?

.shift() 就是专门用来处理这类型需求的。它的工作原理类似 .pop(),但它移除的是第一个元素,而不是最后一个。

③连接数组

concat() 方法

JavaScript的 concat() 方法允许您连接数组并创建一个全新的数组。

concat 操作不会影响原数组 - 它会将所产生的连接作为新数组返回。

④遍历

forEach() 方法

forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数。

对于空数组是不会执行回调函数的。

var numbers = [64, 45, 72, 11, 49];
function getNumsAndIndex(num,index) {
    console.log(index+":\t"+num);
}
numbers.forEach(getNumsAndIndex);

⑤查找

indexOf() 方法

indexOf() 方法可返回数组中某个指定的元素位置。

该方法将从头到尾地检索数组,看它是否含有对应的元素。

返回第一次出现该元素的位置

如果在数组中没找到指定元素则返回 -1。

⑥切片

slice() 方法

slice() 方法可从已有的数组中返回选定的元素。

slice() 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。

注意:

slice() 方法不会改变原始数组。

语法

array.slice(start, end)

img

返回值

img

⑦关联数组

虽然许多编程语言支持具有命名索引的数组(文本而不是数字),称为关联数组,但JavaScript不支持。

但是,您仍然可以使用命名数组语法,这将产生一个对象。 例如:

var person = []; // 空数组
person["name"] = "Loen";
person["age"] = 28;
document.write(person["age"]);
// -> "28"

现在,person 被视为一个对象,而不是一个数组。

命名索引“name”和“age”成为person对象的属性。

在关联数组中,索引号被替换为字符串

注意:

当 person 数组被视为对象时,标准数组方法和属性将产生不正确的结果。例如,现在person.length将返回0。

JavaScript不支持使用名称索引数组。

在JavaScript中,数组总是使用数字编号的索引。

当您希望索引为字符串(文本)时,最好使用对象。

当您希望索引为数字时使用数组。

22.常用对象

JavaScript对象_w3cschool

(1)String

String 对象用于处理文本(字符串)。

String 对象创建方法: new String()。

img

注意:

indexOf() 方法区分大小写

replace()在字符替换的情况下,只会替换一次,替换第一个匹配到的。

使用正则替换,最好只替换字母、数字和汉字,替换特色字符会有问题

正则表达式:

JavaScript正则在线测试工具 - 正则表达式工具 - W3Cschool

正则表达式语法速查|正则教程 (stackoverflow.org.cn)

substring() 方法

substring() 方法用于提取字符串中介于两个指定下标之间的字符。

substring() 方法返回的子串包括 开始 处的字符,但不包括 结束 处的字符。

语法

string.substring(from, to)
参数描述
from必需。一个非负的整数,规定要提取的子串的第一个字符在 string Object 中的位置。
to可选。一个非负的整数,比要提取的子串的最后一个字符在 string Object 中的位置多 1。 如果省略该参数,那么返回的子串会一直到字符串的结尾。

substring() 提取从 indexStartindexEnd(不包括)之间的字符。特别地:

  • 如果 indexStart 等于 indexEndsubstring 返回一个空字符串。

  • 如果省略 indexEndsubstring 提取字符一直到字符串末尾。

  • 如果任一参数小于 0 或为 NaN,则被当作 0

  • 如果任一参数大于 stringName.length,则被当作 stringName.length

  • 如果 indexStart 大于 indexEnd,则 substring 的执行效果就像两个参数调换了一样。

(2)Window对象

Window 对象表示浏览器中打开的窗口。

如果文档包含框架(< frame> 或 < iframe> 标签),浏览器会为 HTML 文档创建一个 window 对象,并为每个框架创建一个额外的 window 对象。

window作为全局变量,代表了脚本正在运行的窗口,暴露给Javascript代码。

img

<!DOCTYPE html>
<html>
<head> 
<meta charset="utf-8"> 
<title>W3Cschool教程(w3cschool.cn)</title> 
</head>
<body>
<p>文档显示区的高度:<span id="winInnerHeight"></span></p>
<p>文档显示区的宽度:<span id="winInnerWidth"></span></p>
<br>
<p>返回窗口的外部宽度,包含工具条与滚动条:<span id="winOuterWidth"></span></p>
<p>返回窗口的外部高度,包含工具条与滚动条:<span id="winOuterHeight"></span></p>
​
<br>
<p>相对于屏幕窗口的x坐标:<span id="winScreenLeft"></span></p>
<p>相对于屏幕窗口的y坐标:<span id="winScreenTop"></span></p>
<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
<script>
var winInnerHeight = window.innerHeight; //返回窗口的文档显示区的高度。
var winInnerWidth = window.innerWidth; //返回窗口的文档显示区的宽度。
​
var winOuterWidth = window.outerWidth; // 返回窗口的外部宽度,包含工具条与滚动条。
var winOuterHeight = window.outerHeight; // 返回窗口的外部高度,包含工具条与滚动条。
​
var winScreenLeft = window.screenLeft; // 返回相对于屏幕窗口的x坐标
var winScreenTop = window.screenTop; // 返回相对于屏幕窗口的y坐标
​
document.getElementById('winInnerHeight').innerHTML = winInnerHeight;
document.getElementById('winInnerWidth').innerHTML = winInnerWidth;
​
document.getElementById('winOuterWidth').innerHTML = winOuterWidth;
document.getElementById('winOuterHeight').innerHTML = winOuterHeight;
​
document.getElementById('winScreenLeft').innerHTML = winScreenLeft;
document.getElementById('winScreenTop').innerHTML = winScreenTop;
</script>
​
</body>
</html>

窗口对象方法

我们之前有使用过的alert()就是window对象的方法,调用window对象方法可以不需要指定window对象:

alert("hello world");
// 等价于
window.alert('hello world');

窗口对象方法

img

open() 方法

open() 方法用于打开一个新的浏览器窗口或查找一个已命名的窗口。

语法

window.open(URL,name,specs,replace)

img

img

实例:在新浏览器窗口中打开 网址

function open_win() {
    window.open("http://www.w3cschool.cn");
}

实例:下面的示例在一个新的浏览器打开一个window空白页:

function openWin(){
    myWindow=window.open('','','width=200,height=100');
    myWindow.document.write("<p>这是'我的窗口'</p>");
    myWindow.focus();
}

setTimeout() 方法

setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。

  • 如果你只想重复执行可以使用 setInterval() 方法。 使用 clearInterval() 方法来阻止函数的执行

  • 使用 clearTimeout() 方法来阻止函数的执行。

setTimeout(function(){ alert("Hello"); }, 3000);

实例: 打开一个新窗口,3 秒后将该窗口关闭

var myWindow = window.open("", "", "width=200, height=100");
myWindow.document.write("<p>这是一个新窗口'</p>");
setTimeout(function(){ myWindow.close() }, 3000);

实例: 使用 clearTimeout() 来阻止函数的执行

var myVar;
 
function myFunction() {
    myVar = setTimeout(function(){ alert("Hello") }, 3000);
}
 
function myStopFunction() {
    clearTimeout(myVar);
}

(3)JSON

JSON (英文全称 JavaScript Object Notation) 是用于存储和传输数据的格式。

JSON 通常用于服务端向网页传递数据 。

JSON 是一种轻量级的数据交换格式。

  • JSON 使用 JavaScript 语法,但是 JSON 格式仅仅是一个文本。

  • 文本可以被任何编程语言读取及作为数据格式传递。

JSON 语法规则

  • 数据为 键/值 对。

  • 数据由逗号分隔。

  • 大括号保存对象

  • 方括号保存数组

JSON 数据 - 一个名称对应一个值

JSON 数据格式为 键/值 对,就像 JavaScript 对象属性。

键/值对包括字段名称(在双引号中),后面一个冒号,然后是值:

"name":"W3Cschool"

JSON 对象

JSON 对象保存在大括号内

就像在 JavaScript 中, 对象可以保存多个 键/值 对:

{"name":"W3Cschool", "url":"www.w3cschool.cn"}

JSON 数组

JSON 数组保存在中括号内。

就像在 JavaScript 中, 数组可以包含对象:

{"sites":[
    {"name":"W3Cschool", "url":"www.w3cschool.cn"}, 
    {"name":"Google", "url":"www.google.com"},
    {"name":"Taobao", "url":"www.taobao.com"}
]}

在以上实例中,对象 "sites" 是一个数组,包含了三个对象。

每个对象为站点的信息(网站名和网站地址)。

(1)内置方法

JSON.parse() 方法用于将一个 JSON 字符串转换为对象。

JSON.parse(text, reviver)
  • text: 必需, 一个有效的 JSON 字符串。

  • reviver: 可选,一个转换结果的函数, 将为对象的每个成员调用此函数。

如果指定了 reviver 函数,则解析出的 JavaScript 值(解析值)会经过一次转换后才将被最终返回(返回值)。更具体点讲就是:解析值本身以及它所包含的所有属性,会按照一定的顺序(从最最里层的属性开始,一级级往外,最终到达顶层,也就是解析值本身)分别的去调用 reviver 函数,在调用过程中,当前属性所属的对象会作为 this 值,当前属性名和属性值会分别作为第一个和第二个参数传入 reviver 中。如果 reviver 返回 undefined,则当前属性会从所属对象中删除,如果返回了其他值,则返回的值会成为当前属性新的属性值。

当遍历到最顶层的值(解析值)时,传入 reviver 函数的参数会是空字符串 ""(因为此时已经没有真正的属性)和当前的解析值(有可能已经被修改过了),当前的 this 值会是 {"": 修改过的解析值},在编写 reviver 函数时,要注意到这个特例。(这个函数的遍历顺序依照:从最内层开始,按照层级顺序,依次向外遍历)

JSON.parse('{"p": 5}', function (k, v) {
  if (k === "") return v; // 如果到了最顶层,则直接返回属性值,
  return v * 2; // 否则将属性值变为原来的 2 倍。
}); // { p: 10 }
​
JSON.parse('{"1": 1, "2": 2,"3": {"4": 4, "5": {"6": 6}}}', function (k, v) {
  console.log(k); // 输出当前的属性名,从而得知遍历顺序是从内向外的,
  // 最后一个属性名会是个空字符串。
  return v; // 返回原始属性值,相当于没有传递 reviver 参数。
});

注意:

JSON.parse() 不允许用逗号作为结尾

JSON.stringify() 方法

JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串。

语法

JSON.stringify(value, replacer, space)

参数说明:

  • value: 必需, 要转换的 JavaScript 值(通常为对象或数组)。

  • replacer:可选。用于转换结果的函数或数组。如果 replacer 为函数,则 JSON.stringify 将调用该函数,并传入每个成员的键和值。使用返回值而不是原始值。如果此函数返回 undefined,则排除成员。根对象的键是一个空字符串:""。如果 replacer 是一个数组,则仅转换该数组中具有键值的成员。成员的转换顺序与键在数组中的顺序一样。

  • space: 可选,文本添加缩进、空格和换行符,如果 space 是一个数字,则返回值文本在每个级别缩进指定数目的空格,如果 space 大于 10,则文本缩进 10 个空格。space 也可以使用非数字,如:\t。

返回值:

返回包含 JSON 文本的字符串。

实例

var str = {"name":"W3Cschool", "site":"http://www.w3cschool.cn"}
str_pretty1 = JSON.stringify(str)
document.write( "只有一个参数情况:" );
document.write( "<br>" );
document.write("<pre>" + str_pretty1 + "</pre>" );
 
document.write( "<br>" );
str_pretty2 = JSON.stringify(str, null, 4) //使用四个空格缩进
document.write( "使用参数情况:" );
document.write( "<br>" );
document.write("<pre>" + str_pretty2 + "</pre>" ); // pre 用于格式化输出

(4)Math 对象

Math(算数)对象的作用是:执行普通的算数任务。

Math 对象提供多种算数值类型和函数。无需在使用这个对象之前对它进行定义。

img

注意:

Math 没有构造函数。没有必要先创建一个Math对象。

Math 对象方法

Math对象包含许多用于计算的方法:

img

floor() 方法:

Math.floor(x) 返回小于或等于一个给定数字的最大整数。

Math.floor()向下取整。

random() 方法:

Math.random() 返回 [0,1) 之间的一个随机数:

round 方法:

Math.round() 返回一个数字四舍五入后最接近的整数。

与很多其他语言中的round()函数不同,Math.round()并不总是舍入到远离0的方向(尤其是在负数的小数部分恰好等于0.5的情况下)。

x = Math.round(20.49);   //20
x = Math.round(20.5);    //21
x = Math.round(-20.5);   //-20
x = Math.round(-20.51);  //-21

(5)Date 对象

日期对象用于处理日期和时间。

日期由 年,月,日,时,分,秒和毫秒组成。

使用 new Date() , 将创建一个存储当前日期和时间的日期对象。

var d = new Date();
//d 存储了当前的日期和时间

初始化日期的其他方法允许从指定的日期和时间创建新的日期对象。

new Date(milliseconds) // 毫秒
new Date(dateString) // 日期字符串
new Date(year, month, day, hours, minutes, seconds, milliseconds) //年,月,日,时,分,秒和毫秒

提示: JavaScript日期以1970年01月01日00:00:00世界时(UTC)计算。一天包含 86400000 毫秒。

//Fri Jan 02 1970 08:00:00 GMT+0800 (中国标准时间)
var d1 = new Date(86400000); 
​
//Thu Oct 19 2017 15:56:00 GMT+0800 (中国标准时间)
var d2 = new Date("October 19, 2017 15:56:00");
//Sat Jun 11 1988 11:42:00 GMT+0800 (中国标准时间)
var d3 = new Date(88,5,11,11,42,0,0);

提示: JavaScript计数从0到11的月份。1月是0,12月是11。 日期对象是静态的,而不是动态的。计算机时间正在往前走,但是日期对象一旦创建,日期就不会改变。

Date 方法

当创建一个Date 对象时,有很多方法可以对它进行操作。

img

img

img

实时打印当前时间

function printTime() {
  var d = new Date();
  var hours = d.getHours();
  var mins = d.getMinutes();
  var secs = d.getSeconds();
  document.body.innerHTML = hours+":"+mins+":"+secs;
}
setInterval(printTime, 1000); // setInterval 第二个参数单位是 毫秒

(6)DOM

HTML DOM

通过 HTML DOM,JavaScript 可访问 HTML 文档的所有元素。

HTML DOM (文档对象模型)

当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。

HTML DOM 模型被构造为对象的树:

img

通过可编程的对象模型,JavaScript 获得了足够的能力来创建动态的 HTML。

  • JavaScript 能够改变页面中的所有 HTML 元素

  • JavaScript 能够改变页面中的所有 HTML 属性

  • JavaScript 能够改变页面中的所有 CSS 样式

  • JavaScript 能够对页面中的所有事件做出反应

DOM 表示文档为树形结构。

HTML 元素成为树中的相关节点。

树中的所有节点之间都有某种关系。

节点可以有子节点。拥有同一父节点的节点称为兄弟节点。

< html>有两个子节点(< head>,< body>);

< head>有一个子节点(< title>)和一个父节点(< html>);

< title>有一个父节点(< head>),没有子节点;

< body>有两个子节点(< h1>和< a>)和一个父节点(< html>);

document 对象

document对象是文档的根节点,window.document属性就指向这个对象。也就是说,只要浏览器开始载入HTML文档,这个对象就开始存在了,可以直接调用。

JavaScript中有一个预定义的 document 对象,可用于访问DOM上的所有元素。

换句话说,文档对象是网页中所有对象的所有者(或根)。

因此,如果要访问HTML页面中的对象,则始终访问 document 对象。

①元素选择

所有HTML元素都是对象。并且我们知道每个对象都有属性和方法。

document 对象具有三种方法最常用于选择HTML元素:

//通过 id 找元素
document.getElementById(id) 
​
//通过 类 找元素
document.getElementsByClassName(name) 
​
//通过 标签 找元素
document.getElementsByTagName(name)

getElementsByClassName() 方法通过类名查找所有元素,并将其作为数组返回。

getElementsByTagName 方法返回指定标签名称的所有元素,作为数组返回。

DOM中的每个元素都有一组属性和方法,它们提供有关它们在DOM中的关系的信息:

element.childNodes 返回一个元素的子节点的数组。

element.firstChild 返回元素的第一个子节点。

element.lastChild 返回元素的最后一个子节点。

element.hasChildNodes 如果元素有任何子节点,则返回 true,否则为 false 。

element.nextSibling 返回相同树级别的下一个节点。

element.previousSibling 返回在同一树级别的上一个节点。

element.parentNode 返回元素的父节点。

②改变属性

选择要使用的元素后,您可以更改其属性。

可以使用JavaScript更改元素的所有属性。

<img id="myimg" src="https://www.w3cschool.cn/attachments/cover/cover_php.jpg" alt="" />
<script>
    var el = document.getElementById("myimg"); // 通过id="myimg"获取元素
    el.src = "https://www.w3cschool.cn/attachments/cover/cover_html.png";
</script>
    <a href="http://www.baidu.com">百度</a>
<script>
    var el = document.getElementsByTagName("a");
    el[0].href = "https://www.w3cschool.cn";
    el[0].innerHTML = "W3Cschool";
</script>

使用元素的 style 对象来访问所有样式属性。

<div id="demo" style="width:200px">一些文本</div>
<script>
  var x = document.getElementById("demo");
  x.style.color = "6600FF";
  x.style.width = "100px";
</script>

所有CSS属性都可以使用JavaScript进行设置和修改。请记住,您不能在属性名称中使用破折号( - ):这些替换为驼峰写法,其中复合词以大写字母开头 比如: background-color属性应该被写为 backgroundColor

③添加/移除/替换元素

element.cloneNode() 克隆元素并返回结果节点。

document.createElement(element) 创建一个新的元素节点。

document.createTextNode(text) 创建一个新的文本节点。

var node = document.createTextNode("一些新的文本");

这将创建一个新的文本节点,但它将不会出现在文档中,直到您使用以下方法之一将其附加到现有元素:

element.appendChild(newNode) 将一个新的子节点添加到元素作为最后一个子节点。

element.insertBefore(node1, node2) 在节点2之前插入node1作为子节点。

例如:

<div id ="demo">一些文本</div>
​
<script>
  //创建一个新的段落
  var p = document.createElement("p");
  var node = document.createTextNode("一些新的文本");
  //添加文本到段落
  p.appendChild(node);
​
  var div = document.getElementById("demo");
  //将段落添加到div中
  div.appendChild(p);
</script>

要删除HTML元素,您必须选择元素的父项并使用 removeChild(node) 方法。

例如:

<div id="demo">
  <p id="p1">这是一个段落.</p>
  <p id="p2">这是另外一个段落.</p>
</div>
​
<script>
var parent = document.getElementById("demo");
var child = document.getElementById("p1");
parent.removeChild(child);
</script>

实现相同结果的另一种方法是使用 parentNode 属性来获取要删除的元素的父项

var child = document.getElementById("p1");
child.parentNode.removeChild(child);

要替换HTML元素,使用 element.replaceChild(newNode,oldNode) 方法。

<div id="demo">
  <p id="p1">这是一个段落</p>
  <p id="p2">这是另一个段落</p>
</div>
​
<script>
var p = document.createElement("p");
var node = document.createTextNode("这是新的文本");
p.appendChild(node);
​
var parent = document.getElementById("demo");
var child = document.getElementById("p1");
parent.replaceChild(p, child);
</script>

23.动画

通过操作元素的属性和样式来实现动画效果,具体的网上搜吧,不写了~

24.事件

JavaScript使我们有能力创建动态页面,网页中的每一个元素都可以产生某些触发JavaScript函数的事件。

我们可以认为事件是可以被JavaScript侦测到的一种行为。

您可以编写事件触发执行的Javascript代码,例如用户单击HTML元素,移动鼠标或提交表单时。

当目标元素发生事件时,执行处理函数。

常见的HTML事件包括:

img

相应的事件可以添加到HTML元素作为属性。

<p id="tip">这边显示提示</p>
​
<h2 id="tip">这边显示提示</h2>
​
<hr>
​
<p onclick="clickfn()">点击我看看</p>
​
<br>
​
<input type="text" onfocus="focusfn()" onblur="blurfn()"  value="获得焦点" />
​
<br><br>
​
<div onmouseover="moverfn()" onmouseout="moutfn()" style="">
​
    鼠标移动进来看看
​
</div>
<button onclick="show()">点击我</button>
<script>
function show() {
  alert("你好,我在这里!");
}
</script>

onchange 事件主要用于文本框。当文本框内的文本发生变化并且焦点从元素中丢失时,调用事件处理程序。

(1)事件监听

可以给元素绑定事件监听:

var x = document.getElementById("demo");
​
x.onclick = function () {
  document.getElementById("date").innerHTML = new Date();
}

addEventListener() 方法将事件处理程序附加到元素,而不会覆盖现有的事件处理程序。您可以向一个元素添加许多事件处理程序。

您还可以将许多同一类型的事件处理程序添加到一个元素,即两个“点击”事件。

element.addEventListener(event, function , useCapture);

第一个参数是事件的类型(如“click”或“mouseover”)。

第二个参数是事件发生时要调用的函数。

第三个参数是一个布尔值,指定是否使用事件冒泡或事件捕获。此参数是可选的,更具体教程的可自行搜索

在添加事件类型的时候没有on, 用的是 click 而不是 onclick

element.addEventListener("click", myFunction);
element.addEventListener("mouseover", myFunction);
​
function myFunction() {
  alert("Hello W3Cschool");
}

删除事件监听

我们可以使用 removeEventListener 删除事件监听:

element.removeEventListener("mouseover", myFunction);

我们创建一个事件处理程序,在执行后会自动删除:

<button id="demo">开始</button>
​
<script>
var btn = document.getElementById("demo");
btn.addEventListener("click", myFunction);
​
function myFunction() {
  alert(Math.random());
  btn.removeEventListener("click", myFunction);
}
</script>

Internet Explorer版本8及更低版本不支持 addEventListener() 和 removeEventListener() 方法。但是,您可以使用 document.attachEvent() 方法在Internet Explorer中附加事件处理程序。

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值