<script text="text/javascript"> </script>
自动类型转换
在JavaScript中有自动类型转换
+ 在JavaScript里面可以是字符拼接符,也可以是运算符,当 + 左右两边都是数字则是加法,否则是字符串拼接
<script text="text/javascript">
//定义字符串变量
var a = "3.145";
//让字符串变量和数值执行算数运算
var b = a - 2;
var c = a + 2;
//输出b和c的值
alert(b + "\n" + c); </script>
parseInt() 将字符串转换为整数
parseFloat() 转换成浮点数,只会把碰到的非字母的数字转换成数字,一遇到字母就会停止继续转换
<script text="text/javascript">
//定义字符串变量
var a = "j3.145";
alert(parseFloat(a)); </script>
<script text="text/javascript">
//定义字符串变量
var a = "3.ddd145";
alert(parseFloat(a)); </script>
<script text="text/javascript">
//定义字符串变量
var a = "3.145dfvdf";
alert(parseFloat(a)); </script>
当字符串不是数字开头是转换成NaN,像undefined、布尔类型的值、都转换成NaN
转换后的不是数字就是NaN
变量作用域
在函数中不加var定义的变量都是全局变量,隐式定义变量
<script text="text/javascript">
var test = "全局变量";
function myFun() {
age = 20;
var male = "局部变量";
}
myFun();
alert(test + age + male); </script>
因为male是局部变量
当全局变量和局部变量名字相同时,局部变量会覆盖全局变量
<script text="text/javascript">
var test = "全局变量";
function myFun() {
var test = "局部变量";
alert(test);
}
myFun();
</script>
块范围:JavaScript中一般没有块范围
typeof单目运算符
<script>
function test(o) {
var i = 0;
if (typeof o == "object") {
var j = 5;
for (var k = 0; k < 10; k++) {
console.log(k);
}
console.log(k);
}
console.log(k + "\n" + j);
}
test(window); </
script>
if语句组成了块,for也组成了块,出了for循环仍然可以用k这个变量,但它仍然是局部变量,不能够出函数这个范围
let定义的变量有块范围
<script>
function test(o) {
if (typeof o == "object") {
let j = 5;
for (let k = 0; k < 10; k++) {
console.log(k);
}
console.log(k);
}
console.log(k + "\n" + j);
}
test(window);
</script>
全局变量对HTML事件处理依然有效
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title>
<script>
var x = "全局变量";
</script> </head> <body>
<!-- HTML事件处理 onclick="alert(123)" -->
<input type="button" value="局部变量" onclick="alert(x)">
</body>
</html>
变量提升机制
<script>
//定义全局变量
var scope = "全局变量";
function test() {
document.writeln(scope + "<br >");
//输出undefined
//定义scope局部变量,其作用范围为整个函数内
var scope = "局部变量";
//再次输出scope的值
document.writeln(scope + "<br >");//输出局部变量
}
test();
</script>
//变量提升
//下面的代码解释变量提升,所以要正规定义并赋值变量
<script>
//定义全局变量
var scope = "全局变量";
function test() {
var scope;//定义
document.writeln(scope + "<br >");
//定义scope局部变量,其作用范围为整个函数内
scope = "局部变量";//赋值
//再次输出scope的值
document.writeln(scope + "<br >");
}
test();
</script>
let关键字
let有块范围
let定义的变量不会强加给window
let定义的变量不会变量提升(提前转载)
const常量
必须定义时初始化值,且后面不能修改
命名规则
一般用全大写字母作为变量名
如果是多个单词,中间使用_连接
基本数据类型
字面量创建数值类型
var a = 10
面向对象创建数据类型
var a = new Number("10");
科学计数法使用51.2E2来表示,其中E不区分大小写,举例:5.12e3、4E-4
正无穷大和负无穷大
Infinity 和 -Infinity
且二者相加为NaN
NaN是Not a Number
isNaN()判断一个数是否是NaN
NaN==NaN为False
<input type="text" id="gyj">
<input type="button" value="验证是否为数值" id="check">
<script>
var gyj = document.getElementById("gyj");
var check = document.getElementById("check");
check.onclick = function() {
var val = gyj.value
val = parseInt(val)
if (isNaN(val)) {
alert("不是整数")
} else {
alert("是整数")
}
}
</script>
JavaScript中快速得到特殊数值的方法:
NaN Infinity 和 -Infinity 最大和最小
浮点数精度会丢失,若想比较,则使用差值法
字符串类型
JavaScript的字符串必须用引号,可以双可以单 比较是否相等可以直接用==
String()
<script>
var a = String("你好")
console.log(a)
</script>
charAt()
charCodeAt()
length(是一个属性,不是方法)
fromCharCode()
<script>
var a = String("dhufghsjksl")
var b = a.charAt(2)//获取字符串的第三个字母
var c = a.charCodeAt(2)//获取字符串第三个字母的Unicode值
var d = a.length //获取字符串的长度
var e = String.fromCharCode(99)//获得Unicode为99的值 console.log(a + '\n' + b + '\n' + c + '\n' + d + '\n' + e)
</script>
toLowerCase()
toUpperCase()
<script>
var a = String("dhufgOOOhsjksl")
var b = a.toLowerCase() //全部转化成小写字母
var c = a.toUpperCase() //全部转化成大写字母
console.log(a + '\n' + b + '\n' + c)
</script>
indexOf()
lastIndexOf()
<script> var a = String("dhufglhsgjksl") var b = a.indexOf('hufg') //寻找hufg第一次出现的位置,若没有就返回-1 若有就返回对应的位置 var c = a.lastIndexOf('l') //寻找l最后一次出现的位置,若没有返回-1 若有就返回对应的位置 var d = a.indexOf("g", 6) //跳过6个字符寻找g var e = a.length console.log(a + '\n' + b + '\n' + c + '\n' + d + '\n' + e) </script>
substring()
slice() 二者功能相似,但是slice()可以接收负数作为索引
要头不要尾
<script>
var a = String("dhufglhsgjksl")
var b = a.substring(4, 9)//截取第五个字符(包括)到第十个(不包括)
var c = a.slice(4, -1)//截取第五个字符(包括)到最后一个(不包括)
var d = a.slice(-1)//单独截取最后一个
var e = a.length
console.log(a + '\n' + b + '\n' + c + '\n' + d + '\n' + e)
</script>
match() 返回字符串数组或null 支持使用全局匹配 通过g标志表示全局匹配
search() 返回索引值
二者都支持使用正则表达式作为子串
<script>
var a = String("dh11ufglh22s54gjksl")
var b = a.match(/\d/g); //寻找所有数字,最终组成数组,g表示全局匹配
var c = a.search(/\d/); //寻找第一次数字的位置
console.log(b) console.log(c)
</script>
不能用这种形式输出:console.log(a + '\n' + b + '\n' + c)
否则
concat()
split()
replace()
<script>
var a = "dh1"
var e = "as2"
var d = "df3"
var f = a.concat(e, d)
console.log(f)
var b = "sjdfbsigsiudvuo"
var c = b.split("s") //以s来把字符串分割成组数
console.log(f)
console.log(c)
var text = "dsfnosgufuigs"
var text1 = text.replace(/s/g, "青城") //把所有的7换成青城
</script>
boolean(布尔类型)
ture和 false(!)
undefined
定义变量但没赋值
对象的属性不存在
null
null==undefined(true)
null===undefined (false 恒等 还要比较类型)
正则表达式
JavaScript中正则表达式必须在 // 两个斜线之间
提供了test()方法来判断是否符合正则表达式的规则
<script>
var str = "dsfhuhn"
var reg = /^[a-c]{3}@:/ //字面量的方式定义正则表达式 开头必须是a-c且必须出现三次 @无关紧要
console.log(reg.test(str)) //返回false aaa@:dijfduiv返回true
</script>
定义正则表达式有两种方式
var reg = new RegExp("/^[a-c]{3}@")//面向对象的方法定义正则表达式
<script>
var text = "1112ab"
var reg = /^[a-c0-9]{6}$/
var flag = reg.test(text)
function check() {
if (text.trim() == "") {
console.log("密码不能为空")
return
}
if (!flag) {
console.log("密码不对,密码必须是六位,并且是数字和字母")
return
}
console.log("密码正确")
}
check()
</script>