一个网页的基础元素:
1.html属于搭建页面结构
2.css美化页面
3.JavaScript给页面添加行为
JavaScript属于解释型语言,不需要编译,可以直接插入到html页面中由浏览器解释执行。对于Java程序员来讲,这应该是接触的第一个解释型语言,那么它与我们平时用到的编译型语言–Java有什么不同呢?
解释执行:由解释器根据输入的数据当场执行而不生成任何的目标程序。
编译执行:先将源代码编译成目标语言(如:字节码文件),之后通过相应的执行程序(JVM)进行加载执行。
在知乎上看到一个比较有意思的解释:
编译执行相当于先把菜一次性都做好,然后摆在餐桌上吃;而解释执行就相当于吃火锅,下一个吃一个。
如果单纯的考虑吃饭速度(执行效率)肯定是炒菜(编译执行)较快,因为可以直接吃而火锅还得煮。
引入JavaScript
1.直接在事件中调用
<input type="button" value="我是按钮" onclick="alert('helloworld1')">
复制代码
2.通过script标签引入
<!--可以写在任意位置,推荐写在head标签中-->
<script type="text/javascript">
alert('helloworld2')
</script>
复制代码
在日常的开发中,我们通常会定义一个.js文件,将用到的方法统一定义在一个文件中,如果需要调用就将该文件引入。
<!--script必须有关闭标签,不能自闭。(会导致运行出错)-->
<script src="first.js"></script>
复制代码
基本数据类型
JavaScript共定义了七种数据类型,分为 “基本类型” 和 “引用类型” 两大类:
- 基本类型:String、Number、Boolean、Symbol、Undefined、Null
- 引用类型:Object
String
JavaScript中采用的是Unicode的编码方式,中文与英文均占2个字符。
具体的编码细节,参见:
同Java类似,基本数据类型是不具备可操作的方法的,为了方便对其进行操作就定义了相应的包装类型。所以当你调用方法的时候,实质上是创建了包装类的对象调用,返回值后再将对象进行销毁:
var msg = "hello";
msg = msg.substring(1,3);
var obj = new String("hello");
// 截取字符串:含头不含尾
msg = obj.substring(1,3);
obj = null;
复制代码
Number
JavaScript中的数值类型只有Number一种,双精度浮点数采用64位表示,所以一个Number类型的数字占8个字节。
双精度浮点数进行运算时可能会导致精度丢失,参见:
数值转换的三个方法:
Number()
可以转换任意类型,在操作符中也会进行调用:
(1)如果是Boolean值,true和false将分别转换为1和0。
(2)如果是数字值,只是简单的传入和返回。
(3)如果是null值,返回0。
(4)如果是undefined,返回NaN。
(5)如果是字符串,遵循下列规则:
如果字符串截去开头和结尾的空白字符后,不是纯数字字符串,那么最终返回结果为NaN。
如果是字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即“1”变成1,“123”会变成123,而“011”会 变成11(前导的零被忽略了);
如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(同样也会忽略前导零);
如果字符串中包含有效的十六进制格式,例如”0xf”,则将其他转换为相同大小的十进制整数值;
如果字符串是空的(不包含任何字符),则将其转换为0;
如果字符串中包含除上述格式之外的字符,则将其他转换成NaN.
(6)如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用的对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。
parseInt()
不仅可以解析纯数字字符串,也可以解析以数字开头的部分数字字符串(非数字部分字符串在转换过程中会被去除)。
(1)如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN; 也就是说,用parseInt()转换空字符串会返回NaN。
(2)如果第一个字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。
(3)如果字符串以”0x”开头且后跟数字字符,就会将其当作一个十六进制整数。
(4)如果字符串以”0”开头且后跟数字字符,就会将其当作一个八进制整数。
(5)parseInt()函数增加了第二参数用于指定转换时使用的基数(即多少进制)。
(6)parseInt()函数所解析的是浮点数字符串时,取整操作所使用的方法为“向下取整”。
parseFloat()
与parseInt()一样,parseFloat()也可以解析以数字开头的部分数字字符串(非数字部分字符串在转换过程中会被去除)。与parseInt()不同 的是,parseFloat()可以将字符串转换成浮点数;但同时,parseFloat()只接受一个参数,且仅能处理10进制字符串。
(1)字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串将被忽略。
(2)如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后面都是零),parseFloat()会返回整数。
复制代码
Boolean
布尔类型的变量往往会在操作过程中产生,存在于以下三种操作符:
1.关系操作符(> < <= >=)
数值的比较不用多说,此处重点分析非数值情况:
- 如果两个操作数都是字符串,则逐个比较两者对应的字符编码(charCode),直到分出大小为止 。
- 如果操作数是其他基本类型,则调用Number() 将其转化为数值,然后进行比较。
- NaN 与任何值比较,均返回 false 。
- 如果操作数是对象,则调用对象的 valueOf 方法(如果没有 valueOf ,就调用 toString 方法),最后用得到的结果,根据前面的规则执行比较。
2.相等操作符(== != === !==)
== 和 != 操作符都会先转换操作数,然后再比较它们的相等性:
- 如果有一个操作数是布尔值,则在比较相等性之前,先调用 Number() 将其转换为数值;
- 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前,先调用 Number() 将字符串转换为数值;
- 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf() 方法,用得到的基本类型值按照前面的规则进行比较;
- null 和 undefined 是相等的。在比较相等性之前,不能将 null 和 undefined 转换成其他任何值。
- 如果有一个操作数是 NaN,则相等操作符返回 false,而不相等操作符返回 true;
- 如果两个操作数都是对象,则比较它们的指针地址。如果都指向同一个对象,则相等操作符返回 true;否则,返回 false。
=== 和 !== 操作符最大的特点是,在比较之前不转换操作数 。它们的操作规则如下:
- ===: 类型相同,并且值相等,才返回 true ,否则返回 false 。
- !== : 类型不同,或者值不相等,就返回 true,否则返回 false 。
3.布尔操作符(!)
常用于将一个变量转换成Boolean类型:
console.log(!!0) //false
复制代码
Symbol
Symbol 的目的就是为了创建一个独一无二的值,我不需要关心值的内容,我只需要确定它不会重复。。和其他基本类型不同的,Symbol 没有对应的包装类型,也就是说 Symbol 本身不是对象,而是一个函数。
var s1 = Symbol();
复制代码
注意,Symbol 函数的参数只是表示对当前 Symbol 值的描述,因此,相同参数的 Symbol 函数的返回值也是不相等的。
Undefined
已经声明还未赋值的变量,一个变量创建出来最原始的状态。
Null
一个对象被人为的重置为空对象,而非一个变量最原始的状态 。 如果需要释放某个对象,就将变量设置为 null,即表示该对象已经被清空,目前无效状态。
类型判断
typeof 是一个操作符,其右侧跟表达式并返回它的数据类型,返回的结果用该类型的字符串(全小写字母)形式表示,包括以下 7 种:number、boolean、symbol、string、object、undefined、function。
值得注意的是,使用typeof判断null会返回object。