- 输出(三种)
alert(); //警告框
document.write(); //向body中输出一个内容
console.log(); //向控制台输出一个内容可以向body中输出一个内容
- 编写位置(四种)
<!--
可以将js代码编写到script标签
<script type="text/javascript">
alert("我是script标签中的代码!!");
</script>
-->
<!--
可以将js代码编写到外部js文件中,然后通过script标签引入
写到外部文件中可以在不同的页面中同时引用,也可以利用到浏览器的缓存机制
推荐使用的方式
<script type="text/javascript" src="js/script.js"></script>
-->
<!--
可以将js代码编写到标签的onclick属性中
当我们点击按钮时,js代码才会执行
虽然可以写在标签的属性中,但是他们属于结构与行为耦合,不方便维护,不推荐使用
<button onclick="alert('讨厌,你点我干嘛~~');">点我一下</button>
-->
<!--
可以将js代码写在超链接的href属性中,这样当点击超链接时,会执行js代码
<a href="javascript:alert('让你点你就点!!');">你也点我一下</a>
<a href="javascript:;">你也点我一下</a>
-->
-
变量
字面量,都是一些不可改变的值
-
标识符
JS底层保存标识符时实际上是采用的Unicode编码
-
数据类型
数据类型指的就是字面量的类型
在JS中一共有六种数据类型
String 字符串
Number 数值
Boolean 布尔值
Null 空值
Undefined 未定义
Object 对象
其中String Number Boolean Null Undefined属于基本数据类型
而Object属于引用数据类型在字符串中我们可以使用\作为转义字符,当表示一些特殊符号时可以使用\进行转义
\n 表示换行
\t 制表符
\ 表示\ -
NUmber
JS中可以表示的数字的最大值:Number.MAX_VALUE=1.7976931348623157e+308
最小值:Number.MIN_VALUE=5e-324( 大于0的最小值)如果使用Number表示的数字超过了最大值,则会返回一个
Infinity 表示正无穷
-Infinity 表示负无穷
使用typeof检查Infinity也会返回number
NaN 是一个特殊的数字,表示Not A Number
使用typeof检查一个NaN也会返回number如果使用JS进行浮点运算,可能得到一个不精确的结果。所以千万不要使用JS进行对精确度要求比较高的运算。
-
怎么转换成Number,什么情况下需要转换
转换方式一:
使用Number()函数
字符串 --> 数字
1.如果是纯数字的字符串,则直接将其转换为数字
2.如果字符串中有非数字的内容,则转换为NaN
3.如果字符串是一个空串或者是一个全是空格的字符串,则转换为0
布尔 --> 数字
true 转成 1
false 转成 0
null --> 数字 0
undefined --> 数字 NaN
转换方式二:
这种方式专门用来对付字符串
parseInt() 把一个字符串转换为一个整数
parseFloat() 把一个字符串转换为一个浮点数
转换方式三:
任何值做- * /运算时都会自动转换为Number
我们可以利用这一特点做隐式的类型转换
可以通过为一个值 -0 *1 /1来将其转换为Number
原理和Number()函数一样,使用起来更加简单
转换方式四:
+,对于非Number类型的值,
它会将先转换为Number,然后在运算
可以对一个其他的数据类型使用+,来将其转换为number
它的原理和Number()函数一样
转换方式五:(转成String):
任何值和字符串相加都会转换为字符串,并做拼串操作
我们可以利用这一特点,来将一个任意的数据类型转换为String
我们只需要为任意的数据类型 + 一个 “” 即可将其转换为String
这是一种隐式的类型转换,由浏览器自动完成,实际上它也是调用String()函数
转换方式六:(转成Boolean)
如果对非布尔值进行运算,则会将其转换为布尔值,然后再取反
所以我们可以利用该特点,来将一个其他的数据类型转换为布尔值
可以为一个任意数据类型取两次反,来将其转换为布尔值,
原理和Boolean()函数一样
注意:如果比较的两个字符串型的数字,可能会得到不可预期的结果
在比较两个字符串型的数字时,一定一定一定要转型
console.log("11123123123123123123" < +"5"); //5>1(第一位1与第一位5比) true 使用+将字符串“5”转成数字5
-
自增和自减
a++的值等于原变量的值(自增前的值)
++a的值等于新值 (自增后的值)
a-- 是变量的原值 (自减前的值)
–a 是变量的新值 (自减以后的值) -
关系运算符(大于、小于。。。)
非数值的情况
对于非数值进行比较时,会将其转换为数字然后在比较
如果符号两侧的值都是字符串时,不会将其转换为数字进行比较
而会分别比较字符串中字符的Unicode编码 -
编码
js中,在字符串中使用转义字符输入Unicode编码
\u四位编码
在网页中使用Unicode编码
&#编码; 这里的编码需要的是10进制
console.log("\u2620");
<h1 style="font-size: 200px;">☠</h1>
- 相等运算符
undefined 衍生自 null
所以这两个值做相等判断时,会返回true
NaN不和任何值相等,包括他本身
可以通过isNaN()函数来判断一个值是否是NaN
如果该值是NaN则返回true,否则返回false
console.log(undefined == null);//true
console.log(NaN == NaN); //false
var b = NaN;
console.log(isNaN(b));//true
break关键字可以用来退出switch或循环语句
不能在if语句中使用break和continue
break关键字,会立即终止离他最近的那个循环语句
可以为循环语句创建一个label,来标识当前的循环
label:循环语句
使用break语句时,可以在break后跟着一个label,
这样break将会结束指定的循环,而不是最近的
outer:
for(var i=0 ; i<5 ; i++){
console.log("@外层循环"+i)
for(var j=0 ; j<5; j++){
break outer;
console.log("内层循环:"+j);
}
}
- 测试程序的性能(console.time//计时器)
//在程序执行前,开启计时器
//console.time("计时器的名字")可以用来开启一个计时器
//它需要一个字符串作为参数,这个字符串将会作为计时器的标识
console.time("test");
//打印2-100之间所有的数
for(var i=2 ; i<=100000 ; i++){
var flag = true;
for(var j=2 ; j<=Math.sqrt(i) ; j++){
if(i%j == 0){
//如果进入判断则证明i不是质数,修改flag值为false
flag = false;
//一旦进入判断,则证明i不可能是质数了,此时循环再执行已经没有任何意义了
//使用break来结束循环
break;
//不加break 215ms
//加break 25ms
//修改j<=后 2.6
}
}
//如果是质数,则打印i的值
if(flag){
//console.log(i);
}
}
//终止计时器
//console.timeEnd()用来停止一个计时器,需要一个计时器的名字作为参数
console.timeEnd("test");
/*
* 36
* 1 36
* 2 18
* 3 12
* 4 9
* 6 6
*/
//可以通过Math.sqrt()对一个数进行开方
//var result = Math.sqrt(97);
//console.log("result = "+result)
- 对象
使用new关键字调用的函数,是构造函数constructor
构造函数是专门用来创建对象的函数
var obj=new Object();
-
属性名和属性值
如果要使用特殊的属性名,不能采用“.”的方式来操作
需要使用另一种方式:
语法:对象[“属性名"]=属性值
读取时也需要采用这种方式
使用[]这种方式操作属性,更加灵活
在[]中可以直接传递一个变量,这样变量值是多少就会读取那个属性JS对象的属性值,可以是任意的数据类型
甚至也可以是一个对象 -
in 运算符
通过该运算符可以检查一个对象中是否含有指定的属性
如果有则返回true,没有则返回false
语法:“属性名” in 对象
console.log("name" in obj);
-
基本和引用数据类型
JS中的变量都是保存到栈内存中的,
基本数据类型的值直接在栈内存中存储,
值与值之间是独立存在,修改一个变量不会影响其他的变量对象是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间,
而变量保存的是对象的内存地址(对象的引用),如果两个变量保存的是同一个对象引用,
当一个通过一个变量修改属性时,另一个也会受到影响当比较两个基本数据类型的值时,就是比较值。
而比较两个引用数据类型时,它是比较的对象的内存地址,
如果两个对象是一摸一样的,但是地址不同,它也会返回false -
对象字面量
创建变量方法一:
var obj = new Object();
创建变量方法二:(对象字面量)
var obj={}; -
函数 function
函数也是一个对象
创建方法一:(不推荐)
var fun=new Function(“字符串”);//fun就是一个函数对象
//调用函数 语法:函数对象()
创建方法二:
使用函数声明来创建一个对象
语法:
function 函数名([形参1,形参2,形参3,...,形参n]){
语句.....
}
创建方法三:
使用函数表达式来创建对象
var fun=function 函数名([形参1,形参2,形参3,...,形参n]){
语句.....
}
- 函数的参数
调用函数时解析器不会检查实参的类型,
所以要注意,是否有可能会接收到非法的参数,如果有可能则需要对参数进行类型的检查
函数的实参可以是任意的数据类型
调用函数时,解析器也不会检查实参的数量
多余实参不会被赋值
如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined - ruturn
如果return语句后不跟任何值就相当于返回一个undefined,
如果函数中不写return,则也会返回undefined
return后可以跟任意类型的值
实参可以是任意的数据类型,也可以是一个对象
当我们的参数过多时,可以将参数封装到一个对象中,然后通过对象传递
实参可以是一个对象,也可以是一个函数
function fun3(){
//在函数内部再声明一个函数
function fun4(){
alert("我是fun4");
}
//将fun4函数对象作为返回值返回
return fun4;
}
fun3()();//调用fun4函数
- 枚举对象中的属性
使用for … in 语句
语法:
for(var 变量 in 对象){ }
for…in语句 对象中有几个属性,循环体就会执行几次
每次执行时,会将对象中的一个属性的名字赋值给变量
var obj = {
name:"孙悟空",
age:18,
gender:"男",
address:"花果山"
};
for(var n in obj){
console.log("属性名:"+n);
console.log("属性值:"+obj[n]);
}
- 作用域scope
全局作用域在页面打开时创建,在页面关闭时销毁
在全局作用域中有一个全局对象window,它代表的是一个浏览器的窗口,它由浏览器创建我们可以直接使用
在全局作用域中:
创建的变量都会作为window对象的属性保存
创建的函数都会作为window对象的方法保存
调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁
每调用一次函数就会创建一个新的函数作用域,他们之间是互相独立的
在函数作用域中可以访问到全局作用域的变量
在全局作用域中无法访问到函数作用域的变量
当在函数作用域操作一个变量时,它会先在自身作用域中寻找,如果有就直接使用
如果没有则向上一级作用域中寻找,直到找到全局作用域,
如果全局作用域中依然没有找到,则会报错ReferenceError
在函数中要访问全局变量可以使用window对象
在函数作用域也有声明提前的特性,
使用var关键字声明的变量,会在函数中所有的代码执行之前被声明
数声明也会在函数中所有的代码执行之前执行
在函数中,不适用var声明的变量都会成为全局变量
定义形参就相当于在函数作用域中声明了变量
变量的声明提前
使用var关键字声明的变量,会在所有的代码执行之前被声明(但是不会赋值),
但是如果声明变量时不适用var关键字,则变量不会被声明提前
函数的声明提前
使用函数声明形式创建的函数 function 函数(){}
它会在所有的代码执行之前就被创建,所以我们可以在函数声明前来调用函数
使用函数表达式创建的函数,不会被声明提前,所以不能在声明前调用