JavaScript不同引入方式
和CSS一样,JavaScript有三种不同的引入方式:
内部引入
<body>
<script>
let message = "Hello World"
alert(message)
</script>
</body>
外部引入
<body>
<script src="../javascript/test.js"></script>
</body>
外部引入需要在对应的位置有对应的js文件
在实际开发中外部引入使用较多,这样将HTML、CSS、JS代码分开写是规范的方法。
行内引入
<button onclick="alert('你点击了这个按钮!')">点击我</button>
行内写JavaScript目前阶段使用相对较少
JavaScript引入位置
除开行内引入的方式,JavaScript的引入位置一般是在<body>标签的上方,也就是整个html代码的最末尾,这主要是为了优化页面的加载性能和避免DOM操作错误。主要原因有以下三点:
- 当浏览器遇到<script>标签就会停止HTML的解析,直到脚本解析完毕,这会导致页面呈现延迟。
- 若js脚本在DOM元素加载前运行,并且试图操作DOM元素,就会因为找不到元素报错或失败,将其放在末尾可以确保DOM树构建完成。
- 用户能够更快的看到网页的内容,一般用户打开网页第一时间不涉及交互,而是优先查看内容,这样可以提升用户体验感。
JavaScript输入输出
介绍三种常用的输出方法和一个常用的输入方法:
输出
- document.
write(),这个方法已经被弃用,该方法可以在页面中打印输出内容,并且可以输出HTML标签 - console.log(),这个方法可以在控制台中输出内容,主要是用于开发者使用
- alert(),这个方法是页面弹出提示框,其具有阻塞特性!
document.write("我可以在页面中打印输出内容,但是我已经被废弃了")
console.log("我可以在控制台中输出内容,开发者使用")
alert("您已经使用一次观看次数!")
为什么document.write会被废弃?
主要原因是其具有破坏性,如果在整个页面加载后再使用,那么将会重写整个页面——换句话说,整个页面都白加载了;并且还会阻塞页面的渲染,影响性能,所以说被废弃了。
输入
常用**prompt()**方法进行输入,prompt方法就好像Java中的Scanner和C语言的scanf一样,可以接收用户输入内容。注意,prompt接收的输入内容是String类型的,如果想要进行数学运算等操作需要先进行类型转换。
和Scanner或scanf类似,prompt方法**也是程序主动暂停等待用户从外部输入内容,所以说也会阻塞用户对于页面的其他操作,直到输入框关闭。**因此prompt在正式项目中使用的并不多,更多的是用于测试等,正式项目主要使用表单获取用户输入。
当用户没有输入内容,点击取消或者按下ESC时,prompt的返回值是null,所以说在使用其返回值之前,判断其是否为null是规范的,可以提高程序的健壮性。
let username = prompt("请输入您的用户名")
变量
任何一个变成语言都有变量,JavaScript也不例外。变量是存储数据值的容器,现在一般使用let声明一个变量。
和Java有所不同,JavaScript是一个弱类型语言(也称动态类型语言),在声明变量时无需指定类型,变量类型是在运行时确定的。
int username = "jack";
Java的变量声明必须指定类型,否则直接报错
变量的类型一旦声明不能改变
int a = 123;
a = "hello"; // 直接报错
变量的类型检查是在编译是进行,如果变量内容不匹配其类型,那么就会报错
int number = "123" // 变量类型是int,但是内容是String类型,那么编译时就会报错
并且在java中,假如只声明了一个变量不对其初始化,如果没有使用这个变量,那么程序就可以正常运行;如果使用了这个变量则程序将会报错
let username = "jack"
JavaScript中的变量在声明时无需指定,在运行时,因为变量中存储是一个string类型的数据,所以说运行时才指定变量类型为string
let a = 10 // 此时的a是number类型
a = "hello" // 此时a的类型改变为string类型
console.log(a)
此时控制台会输出hello,并且a的类型是string,说明JavaScript中同一个变量可以被重新赋值为不同类型
并且由于JavaScript是弱类型语言,其支持隐式类型转换:比如在使用算术运算符时字符串和数字之间就可以隐式转换:
let a = 1
let b = "1"
console.log(a + b) // number类型的1被隐式转换为了string类型的"1"
此时控制台会输出11,因为和Java一样,JavaScript重载了“+”运算符,当“+”运算符的操作数有string类型时,会优先将不是string类型的操作数转换为string类型进行字符串拼接,任何类型的变量都可以和string进行字符串拼接
number数据类型
在JavaScript中数字只有number这一种数据类型:
let number1 = 1
let number2 = 3.14
number1和number2两个变量的数据类型都是number,这和Java还要区分int和float有所不同,但是当number类型表示小数时,其是使用双精度浮点数进行表示的
number中的特殊值
number数据类型中有两个特殊的值:NaN(Not a Number)和Infinity(无穷大),NAN表示这个数是一个无效的数字结果,这一般常见于将非数字的字符串转换为数字或者无效的数学运算等。Infinity表示无穷大,这一般常见于除零运算或者数值超出表示范围,这和Java有很大不同,Java中除零运算会出现异常,而JavaScript会得到infinity这个特殊值。
NaN是JavaScript中唯一一个不等于自身的值(NaN === NaN会得到false),并且大部分的涉及NaN的运算得到的结果都是NaN。在涉及这两个特殊值判断时,建议使用number.isNaN()方法判断,在程序中需要避免NaN问题以提高健壮性。
number运算
数学运算和Java相同,多了一个****运算符表示指数运算**。
string数据类型
使用'' 或 "" 或 ``包裹的都是字符串,常用的是''和``
单引号(双引号)会和自己最近的单引号进行匹配,如果在单引号中写单引号就会出现问题,此时可以使用转义字符来解决问题:
let str1 = 'He say 'hello'' // 此时前面两个单引号就近匹配,出现问题
let str2 = 'He say \'hello\'' // 转义字符可以解决问题
模板字符串
有的时候需要在字符串中拼接变量,如果只是用”+“进行拼接,遇到复杂的情况就稍显麻烦并且不够优雅,所以说推荐使用模板字符串进行字符串拼接:
// 模板字符串的语法:使用``构造字符串,并且在${}中写需要拼接的内容
// `asdsad${想要拼接的内容}`
let username = prompt("请输入您的用户名")
console.log("欢迎您:${username}")
// 这样在面对复杂的拼接时可以更加得心应手,并且书写也更加的优雅,建议字符串拼接都使用模板字符串
字符串运算
上文提到,字符串在遇到"+"运算符时刻会优先考虑字符串拼接,但面对其他运算符就是另外的情况:
let a = "4"
let b = 5
console.log(a + b); // 45 当一个字符串类型 + 任意类型,会将其他类型数据转换为字符串类型进行拼接
// 在进行运算操作时,操作符如果不是+,而是其他的运算符,则会尝试将string类型转换为number类型,再进行数学运算
console.log(a - b); // -1
console.log(a * b); // 20
console.log(a / b); // 0.8
console.log(a % b); // 4
console.log(a ** b); // 1024
// 在运算时其他数据类型和number进行计算也会先尝试转换为number再计算
let c = false // false转换为number类型是0,true是1
console.log(a - c) // 0
但如果字符串无法转换为数字,此时的运算就会出现NaN。
boolean数据类型
JavaScript中的boolean类型和C语言相似:只有true和false两个值,用0也可以表示false,用非0的数字可以表示true。
null数据类型
表示一个空值或不存在的对象引用。通常用于主动释放对象或表示“无值”,后期学到对象时再详细说明。
undefined数据类型
表示变量已声明但未赋值。
let a
console.log(a)
// 此时控制台就会输出undefined,因为只是声明了变量a,但是没有对其进行赋值,所以说该变量是undefined
其实除了变量未赋值,函数没有返回值、访问不存在的对象属性、访问越界数组元素、函数调用不传参等都会产生undefined,但这些操作在JavaScript都不会报错,Java就会报错。 并且使用void操作符对任何表达式求值都返回undefined。