《JavaScript》

一、资料

W3school
Runoob
WangDoc

二、简介

1、完整的 JavaScript 实现是由以下 3 个不同部分组成的:


JavaScript

ECMAScript 描述了该语言的语法和基本对象;
DOM (文档对象模型)描述了处理网页内容的方法和接口;
BOM (浏览器对象模型)描述了与浏览器进行交互的方法和接口。

三、使用

1、HTML 中的脚本必须位于 <script> 与 </script> 标签之间

<script>
document.getElementById("demo").innerHTML = "Hello JavaScript";
</script>

2、脚本可被放置在 HTML 页面的 <body> 或 <head> 部分中,但是把脚本置于 <body> 元素的底部,可改善显示速度,因为脚本编译会拖慢显示
3、脚本也可放置于外部文件中,便于相同的脚本被不同的网页使用

<script src="myScript.js"></script>

4、JavaScript 对大小写敏感
5、JavaScript 一般使用以小写字母开头的驼峰大小写:
6、输出语句

// 操作 HTML 元素内容
innerHTML

// 弹出警告
window.alert() 
// 写入到浏览器的控制台
console.log() 
// 将内容写到 HTML 文档中
document.write()

四、语法

1、var

1、变量提升:JavaScript 引擎的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的变量的声明语句,都会被提升到代码的头部,这就叫做变量提升(hoisting)。
2、作用域:对于var命令来说,JavaScript 的区块不构成单独的作用域(scope)。

四、数据类型

1、简介

原始类型(primitive type): Undefined、Null、Boolean、Number 和 String。

请注意:
1、数组的数据类型是对象
2、日期的数据类型是对象

2、typeof运算符

JavaScript 有三种方法,可以确定一个值到底是什么类型:
typeof运算符
instanceof运算符
Object.prototype.toString方法

// undefined
typeof undefined
// "undefined"
typeof v
// "undefined"

// null
typeof null // "object"

// boolean
typeof false // "boolean"

// number
typeof 123 // "number"
typeof NaN // 'number'

// string
typeof '123' // "string"

// 对象类型
typeof window // "object"
typeof {} // "object"
typeof [] // "object"

// 函数
function f() {}
typeof f
// "function"

3、Undefined

1、undefined是一个表示"此处无定义"的原始值,转为数值时为NaN。
2、未定义变量的数据类型是 undefined,尚未赋值的变量的数据类型也是 undefined。

// 变量声明了,但没有赋值
var i;
i // undefined

// 调用函数时,应该提供的参数没有提供,该参数等于 undefined
function f(x) {
  return x;
}
f() // undefined

// 对象没有赋值的属性
var  o = new Object();
o.p // undefined

// 函数没有返回值时,默认返回 undefined
function f() {}
f() // undefined

4、Null

1、null是一个表示“空”的对象,转为数值时为0。
2、null的数据类型是object,这是由于历史原因造成的。1995年的 JavaScript 语言第一版,只设计了五种数据类型(对象、整数、浮点数、字符串和布尔值),没考虑null,只把它当作object的一种特殊值。后来null独立出来,作为一种单独的数据类型,为了兼容以前的代码,typeof null返回object就没法改变了。

5、布尔值

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

undefined
null
false
0
NaN
""或''(空字符串)

6、数值

1、JavaScript 内部,所有数字都是以64位浮点数形式储存,即使整数也是如此。所以,1与1.0是相同的,是同一个数。由于浮点数不是精确的值,所以涉及小数的比较和运算要特别小心。

1 === 1.0 // true

0.1 + 0.2 === 0.3
// false

0.3 / 0.1
// 2.9999999999999996

(0.3 - 0.2) === (0.2 - 0.1)
// false

2、JavaScript 提供Number对象的MAX_VALUE和MIN_VALUE属性,返回可以表示的具体的最大值和最小值。

Number.MAX_VALUE // 1.7976931348623157e+308
Number.MIN_VALUE // 5e-324

3、NaN是 JavaScript 的特殊值,表示“非数字”(Not a Number),主要出现在将字符串解析成数字出错的场合。需要注意的是,NaN不是独立的数据类型,而是一个特殊数值,它的数据类型依然属于Number,使用typeof运算符可以看得很清楚。NaN不等于任何值,包括它本身。

5 - 'x' // NaN
0 / 0 // NaN

typeof NaN // 'number'
NaN === NaN // false

4、Infinity表示“无穷”,用来表示两种场景。一种是一个正的数值太大,或一个负的数值太小,无法表示;另一种是非0数值除以0,得到Infinity。Infinity与NaN比较,总是返回false。

Math.pow(2, 1024) // Infinity
0 / 0 // NaN
1 / 0 // Infinity

5、与数值相关的全局方法

// parseInt方法用于将字符串转为整数
parseInt('123') // 123
// parseInt方法还可以接受第二个参数(2到36之间),表示被解析的值的进制,返回该值对应的十进制数
parseInt('1000') // 1000
parseInt('1000', 10) // 1000
parseInt('1000', 2) // 8
parseInt('1000', 6) // 216
parseInt('1000', 8) // 512


// parseFloat方法用于将一个字符串转为浮点数
parseFloat('3.14') // 3.14


// isNaN方法可以用来判断一个值是否为NaN
isNaN(NaN) // true
isNaN(123) // false
// isNaN只对数值有效,如果传入其他值,会被先转成数值。比如,传入字符串的时候,字符串会被先转成NaN,所以最后返回true,这一点要特别引起注意。也就是说,isNaN为true的值,有可能不是NaN,而是一个字符串,因此,使用isNaN之前,最好判断一下数据类型。
isNaN('Hello') // true
// 相当于
isNaN(Number('Hello')) // true
function myIsNaN(value) {
  return typeof value === 'number' && isNaN(value);
}

// isFinite方法返回一个布尔值,表示某个值是否为正常的数值,除了Infinity、-Infinity、NaN和undefined这几个值会返回false,isFinite对于其他的数值都会返回true
isFinite(Infinity) // false
isFinite(-Infinity) // false
isFinite(NaN) // false
isFinite(undefined) // false
isFinite(null) // true
isFinite(-1) // true

7、字符串

5.1、字符串就是零个或多个排在一起的字符,放在单引号或双引号之中。
5.2、不要把字符串创建为对象,它会拖慢执行速度。
5.3、字符串是不可变的:字符串不能更改,只能替换。所有字符串方法都会返回新字符串。它们不会修改原始字符串。
5.4、字符串可以被视为字符数组,因此可以使用数组的方括号运算符,用来返回某个位置的字符,但是字符串内部的单个字符无法改变和增删,这些操作会默默地失败。

// length属性返回字符串的长度
length

// 把字符串转换为大写,返回新字符串
toUpperCase() 

// 把字符串转换为小写,返回新字符串
toLowerCase() 

// 返回字符串中指定文本首次出现的索引,如果未找到文本,返回 -1
indexOf()

// 返回指定文本在字符串中最后一次出现的索引,如果未找到文本,返回 -1
// 与search() 方法相比,可以设置第二个开始位置参数
lastIndexOf()

// 搜索特定值的字符串,并返回匹配的位置,可设置正则表达式
// 与indexOf() 方法相比,可以设置更强大的搜索值(正则表达式)
search() 

// 提取字符串的某个部分并在新字符串中返回被提取的部分
slice() 

// 类似于 slice() ,不同之处在于 substring() 无法接受负的索引
substring() 

// 类似于 slice(),不同之处在于第二个参数规定被提取部分的长度
substr() 

// 用另一个值替换在字符串中指定的值
// 只替换首个匹配
// 不会改变调用它的字符串,它返回的是新字符串
// 可使用正则表达式作参数
replace()

// 连接两个或多个字符串,可用于代替加运算符
concat() 

// 删除字符串两端的空白符
trim() 

// 返回字符串中指定下标(位置)的字符串
charAt() 

// 返回字符串中指定索引的字符 unicode 编码
charCodeAt() 

// 将字符串转换为数组
split()

8、对象

1、对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。

var obj = {
  foo: 'Hello',
  bar: 'World'
};

2、对象的每一个键名又称为“属性”(property),它的“键值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用。

var obj = {
  p: function (x) {
    return 2 * x;
  }
};

obj.p(1) // 2

3、

// 查看一个对象本身的所有属性,可以使用Object.keys和Object.getOwnPropertyNames
var obj = {
  key1: 1,
  key2: 2
};
Object.keys(obj); // ['key1', 'key2']
Object.getOwnPropertyNames(obj) //  ['key1', 'key2']

// in运算符用于检查对象是否包含某个属性
// in运算符不能识别哪些属性是对象自身的,哪些属性是继承的
var obj = { p: 1 };
'p' in obj // true
'toString' in obj // true

// hasOwnProperty方法判断是否为对象自身的属性
var obj = {};
if ('toString' in obj) {
  console.log(obj.hasOwnProperty('toString')) // false
}

// for...in循环用来遍历一个对象的全部属性,不仅遍历对象自身的属性,还遍历继承的属性
var obj = {a: 1, b: 2, c: 3};
for (var i in obj) {
  console.log('键名:', i);
  console.log('键值:', obj[i]);
}

var person = { name: '老张' };
for (var key in person) {
  if (person.hasOwnProperty(key)) {
    console.log(key);
  }
}

9、数组

1、数组属于一种特殊的对象,在 JavaScript 中对数组使用 typeof 运算符会返回 "object"。
2、数组使用数字索引,对象使用命名索引。数组是特殊类型的对象,具有数字索引。
3、数组是一种动态的数据结构,可以随时增减数组的成员。
4、没有必要使用 JavaScript 的内建数组构造器 new Array(),请使用[] 取而代之!

// typeof运算符会返回数组的类型是object。
typeof [1, 2, 3] // "object"


// length属性返回数组的长度(数组元素的数目)
// length属性是可写的。如果人为设置一个小于当前成员个数的值,该数组的成员数量会自动减少到length设置的值。清空数组的一个有效方法,就是将length属性设为0。
var arr = [ 'a', 'b', 'c' ];
arr.length = 0;
arr // []


// 向数组末尾添加新元素,返回新数组的长度
push()
eg
var fruits = ["Banana", "Orange", "Apple", "Mango"];
var x =  fruits.push("Kiwi"); 
//  x 的值是 5 , fruits 的值是 Banana,Orange,Apple,Mango,Kiwi


// 从数组中删除最后一个元素
pop() 
eg
var fruits = ["Banana", "Orange", "Apple", "Mango"];
var x = fruits.pop();      
// x 的值是 "Mango" ,  fruits 的值是 Banana,Orange,Apple


// 删除首个数组元素,并把所有其他元素“位移”到更低的索引,返回被“位移出”的元素
shift() 
eg
var fruits = ["Banana", "Orange", "Apple", "Mango"];
var x =  fruits.shift();
// x 的值是 "Banana" ,  fruits 的值是 Orange,Apple, Mango


// 在开头向数组添加新元素,并“反向位移”旧元素,返回新数组的长度
unshift() 
eg
var fruits = ["Banana", "Orange", "Apple", "Mango"];
var x = fruits.unshift("Lemon");
// x 的值是 5 , fruits 的值是 Lemon,Banana,Orange,Apple,Mango


// 删除元素,不过使用 delete 会在数组留下未定义的空洞,请使用 pop() 或 shift() 取而代之
delete()
eg
var fruits = ["Banana", "Orange", "Apple", "Mango"];
delete fruits[0];           
// 把 fruits 中的首个元素改为 undefined


// 向数组添加新项,第一个参数定义了应添加新元素的位置,第二个参数定义应删除多少元素,其余参数定义要添加的新元素
// 返回一个包含已删除项的数组
splice() 

// 用数组的某个片段切出新数组。创建新数组,不从源数组中删除任何元素
// 可接受两个参数,该方法会从开始参数选取元素,直到结束参数(不包括)为止
slice() 

// 合并现有数组来创建一个新数组,不会更改现有数组,返回一个新数组
concat() 

// 判断是否是数组
isArray()

// 把数组转换为数组值(逗号分隔)的字符串
toString() 
eg
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.toString(); // Banana,Orange,Apple,Mango

// 将所有数组元素结合为一个字符串还可以规定分隔符
join() 
eg
var fruits = ["Banana", "Orange","Apple", "Mango"];
fruits.join(" * "); // Banana * Orange * Apple * Mango

// 以字母顺序对数组进行排序
sort() 

// 反转数组中的元素
reverse() 

// 查找数组中的最高值
Math.max.apply 

// 查找数组中的最低值
Math.min.apply

// 为每个数组元素调用一次函数
forEach() 

// 对每个数组元素执行函数来创建新数组
map() 

// 创建一个包含通过测试的数组元素的新数组
filter() 

// 检查所有数组值是否通过测试
every() 

10、函数

1、函数是一段可以反复调用的代码块。函数还能接受输入的参数,不同的参数可以返回不同的值。
2、函数可以调用自身,就是递归(recursion)
3、作用域(scope)指的是变量存在的范围。在 ES5 的规范中,JavaScript 只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。
4、函数外部声明的变量就是全局变量(global variable),它可以在函数内部读取。在函数内部定义的变量,外部无法读取,称为“局部变量”(local variable)。对于var命令来说,局部变量只能在函数内部声明,在其他区块中声明,一律都是全局变量。
5、函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域。
6、函数参数如果是原始类型的值(数值、字符串、布尔值),传递方式是传值传递(passes by value),在函数体内修改参数值,不会影响到函数外部。函数参数是复合类型的值(数组、对象、其他函数),传递方式是传址传递(pass by reference),传入函数的原始值的地址,因此在函数内部修改参数,将会影响到原始值。注意,如果函数内部修改的,不是参数对象的某个属性,而是替换掉整个参数,这时不会影响到原始值。

五、DOM

1、DOM属性

// 获取或修改元素内容
element.innerHTML
// 改变图像来源
element.src
// 改变元素的样式
element.style.property
// 隐藏元素
element.style.display="none"(block)

2、DOM方法

// 写到HTML文档中
document.write() 
// 通过id访问元素
document.getElementById()
document.getElementsByTagName()
document.createElement()
document.createTextNode()
appendChild()
removeChild()

3、DOM事件

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

推荐阅读更多精彩内容