1调试代码需要使用 JavaScript 显示数据
JavaScript 可以通过不同的方式来输出数据:
1使用 window.alert() 弹出警告框。
2使用 document.write() 方法将内容写到 HTML 文档中。//如果在文档已完成加载后执行 document.write,整个 HTML 页面将被覆盖
3使用 innerHTML 写入到 HTML 元素。
注意这三者,通过class和tag名来得到的是一个对象列表HTMLCollection,需要使用【】来指定一个
HTMLCollection 不是一个数组!
HTMLCollection 看起来可能是一个数组,但其实不是。
你可以像数组一样,使用索引来获取元素。
HTMLCollection 无法使用数组的方法: valueOf(), pop(), push(), 或 join()
需要操作某个特定的元素,使用 getElementById() 方法将更为有效
var y=x.getElementsByTagName(“p”);
document.getElementById(“part”).innerHTML = y;
document.getElementsByClassName(“xiaomi”)[0].innerHTML= “youhu”;
4使用 console.log() 写入到浏览器的控制台。//浏览器中使用 F12 来启用调试模式, 在调试窗口中点击 “Console” 菜单。
2 变量只是var x进行定义,//后的内容被注释,字符串单双引号皆可,区别大小写,驼峰法命名多行注释/**/,需要使用; ,JavaScript 是脚本语言。浏览器会在读取代码时,逐行地执行脚本代码
Undefined 和 Null
Undefined 这个值表示变量不含有值。
可以通过将变量的值设置为 null 来清空变量。
对象由花括号分隔。在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义。属性由逗号分隔:
var person={firstname:“John”, lastname:“Doe”, id:5566};
对象属性有两种寻址方式: (python和java只有点寻址) ***
name=person.lastname;
name=person[“lastname”];
3let是声明变量只在代码块中可以用
const 恒定 声明的值不能被改变
let用来解决:
使用 var 关键字重新声明变量可能会带来问题。
在块中重新声明变量也会重新声明块外的变量:
var x = 10;
// 这里输出 x 为 10
{
var x = 2;
// 这里输出 x 为 2
}
// 这里输出 x 为 2
在函数体外或代码块外使用 var 和 let 关键字声明的变量也有点类似,都是全局变量
注意let和var同一代码块里不能互相重定义,let和let不能自身重定义
在相同的作用域或块级作用域中,不能使用 let 关键字来重置 var 关键字声明的变量:
在相同的作用域或块级作用域中,不能使用 let 关键字来重置 let 关键字声明的变量:
在相同的作用域或块级作用域中,不能使用 var 关键字来重置 let 关键字声明的变量:
let 关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的
4变量生命周期
在 JavaScript 函数内部声明的变量(使用 var)是局部变量,所以只能在函数内部访问它。(该变量的作用域是局部的)。
可以在不同的函数中使用名称相同的局部变量,因为只有声明过该变量的函数才能识别出该变量。
JavaScript 变量的生命期从它们被声明的时间开始。
局部变量会在函数运行以后被删除。
全局变量会在页面关闭后被删除。
window 对象: 所有数据变量都属于 window 对象
只要函数运行完毕,本地变量就会被删除。
var2 = 2; // 没有使用 var 声明,可配置全局属性
非严格模式下给未声明变量赋值创建的全局变量,是全局对象的可配置属性,可以删除
5函数与python差别在于函数的声明和{}由:代替,内部有;分割是统一语法差别,注意与对象中的方法的差别,函数名提到了前面后面加:,有()符号
6事件和DOM EventListener
onchange HTML 元素改变
onclick 用户点击 HTML 元素
onmouseover 用户在一个HTML元素上移动鼠标
onmouseout 用户从一个HTML元素上移开鼠标
onkeydown 用户按下键盘按键
onload 浏览器已完成页面的加载
addEventListener() 方法添加的事件句柄不会覆盖已存在的事件句柄。
你可以使用 removeEventListener() 方法来移除事件的监听。
document.getElementById(“myBtn”).addEventListener(“click”, displayDate);
事件传递有两种方式:冒泡与捕获。
事件传递定义了元素事件触发的顺序。 如果你将
元素插入到
元素中,用户点击
元素, 哪个元素的 “click” 事件先被触发呢?
在 冒泡 中,内部元素的事件会先被触发,然后再触发外部元素,即:
元素的点击事件先触发,然后会触发
元素的点击事件。
在 捕获 中,外部元素的事件会先被触发,然后才会触发内部元素的事件,即:
元素的点击事件先触发 ,然后再触发
元素的点击事件。
addEventListener() 方法可以指定 “useCapture” 参数来设置传递类型
7通常, JavaScript 字符串是原始值,可以使用字符创建: var firstName = “John”
但我们也可以使用 new 关键字将字符串定义为一个对象: var firstName = new String(“John”)
不要创建 String 对象。它会拖慢执行速度,并可能产生其他副作用
如果把数字与字符串相加,结果将成为字符串!
=== 绝对等于(值和类型均相等)
!== 不绝对等于(值和类型有一个不相等,或两个都不相等)
8在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。
在方法中,this 表示该方法所属的对象。
如果单独使用,this 表示全局对象。
在函数中,this 表示全局对象。
在函数中,在严格模式下,this 是未定义的(undefined)。
在事件中,this 表示接收事件的元素。
类似 call() 和 apply() 方法可以将 this 引用到任何对象。
9continue 语句中断循环中的迭代,如果出现了指定的条件,然后继续循环中的下一个迭代
break 语句跳出循环后,会继续执行该循环之后的代码(如果有的话,注意跳出前的代码要被执行,跳出之后的不,for里面的三段里最后一段要被执行一次,在跳出前的一次循环中)
10 undefined和null相等但不绝对相等
undefined:是所有没有赋值变量的默认值,自动赋值。
null:主动释放一个变量引用的对象,表示一个变量不再指向任何对象地址。
undefined和null在条件中判断做false,但他们本身并不是,他们二者有差别,前者没有赋值,后者赋值null
11 数据的类型,注意未定义的,还有null的类型为对象object
NaN 的数据类型是 number
数组(Array)的数据类型是 object
日期(Date)的数据类型为 object
null 的数据类型是 object
未定义变量的数据类型为 undefined
typeof “John” // 返回 string
typeof 3.14 // 返回 number
typeof NaN // 返回 number
typeof false // 返回 boolean
typeof [1,2,3,4] // 返回 object
typeof {name:‘John’, age:34} // 返回 object
typeof new Date() // 返回 object
typeof function () {} // 返回 function
typeof myCar // 返回 undefined (如果 myCar 没有声明)
typeof null // 返回 object
10JavaScript 中,分号是可选的,在缺少了分号就无法正确解析代码的时候,JavaScript 才会填补分号。
由于 return 是一个完整的语句,所以 javaScript 将关闭 return 语句。所以不用对 return 语句进行断行
11 // 严格模式,只需要在script头部加个use strict就可以,代表开启严格模式,他对于语法的要求更严格,会直接报错,比如定义,程序结构等
消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
消除代码运行的一些不安全之处,保证代码运行的安全;
提高编译器效率,增加运行速度;
为未来新版本的Javascript做好铺垫。
"严格模式"体现了Javascript更合理、更安全、更严谨的发展方向,包括IE 10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱它。
另一方面,同样的代码,在"严格模式"中,可能会有不一样的运行结果;一些在"正常模式"下可以运行的语句,在"严格模式"下将不能运行。掌握这些内容,有助于更细致深入地理解Javascript,让你变成一个更好的程序员。
12变量提升,
对于大多数程序员来说并不知道 JavaScript 变量提升。
JavaScript 严格模式(strict mode)不允许使用未声明的变量。
如果程序员不能很好的理解变量提升,他们写的程序就容易出现一些问题。
为了避免这些问题,通常我们在每个作用域开始前声明这些变量,这也是正常的 JavaScript 解析步骤,易于我们理解。
x = 5; // 变量 x 设置为 5
elem = document.getElementById(“demo”); // 查找元素
elem.innerHTML = x; // 在元素中显示 x
var x; // 声明 x
编译时会把var x提升到第一行,赋值的不动,所以就可以被算作先声明再赋值使用,如果将x=5和varx互换,则在调用elem的方法时没有对x赋值,则输出undefined,如果最后一行初始化var x=6,则会将该句拆成两部分,var x 声明 放在第一行,x=6 初始化赋值 在原地,所以输出也是undefined,只提升声明不提升赋值定义的初始化
12箭头函数=>这里需要知道 构造函数
Function() 构造函数
用函数构造器new一个函数实例
var myFunction = new Function(“a”, “b”, “return a * b”);
var x = myFunction(4, 3);
可以写成
var myFunction = function (a, b) {return a * b}
var x = myFunction(4, 3);
这里注意需要避免使用 new 关键字。
(参数1, 参数2, …, 参数N) => { 函数声明 }
(参数1, 参数2, …, 参数N) => 表达式(单一)
// 相当于:(参数1, 参数2, …, 参数N) =>{ return 表达式; }
var funcName = (params) => params + 2
funcName(2);
// 4
13this的理解
这个我有单独帖子
blog.csdn.net/qlin_11/art…
14闭包
为解决变量出函数以后会被销毁,无法再访问,就内部使用一个内嵌函数,返回该函数,这样内存不被释放,因为函数未执行完。需要值的时候我们在使用内嵌函数就能访问到内存里面保存的数据。要注意释放内存,不然浪费资源,造成所说的内存泄漏。