运算符

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title></title>
	<script>
		/*
		运算符也叫操作符,
		通过运算符可以对一个或多个值进行运算,并获取运算结果,
		比如 typeof 就是运算符,可以来获得一个值的类型,它会将该值的类型以字符串的形式返回。
		*/
		var a = 123;

		var result = typeof a; // number
		console.log(typeof result); // string

		/*
			算数运算符,不会改变原变量,只会返回一个结果。
			当非Number类型的值,会将这些值先转换成Number类型,再进行运算。
			+
			-
			*
			/
			%
		*/
		/*
			+ 可以对两个值进行加法运算,并把结果返回
		*/
		result = a + 1; // result = 124
		console.log(a); // 123

		result = true + 1; // 2

		result = true + false; // 1

		result = 2 + null; // 2

		// 任何值和NaN进行运算,都为NaN.
		result = 2 + NaN; // NaN

		// 如果对两个字符串进行加法,会进行拼串操作,并返回结果.
		result = "123" + "456"; // 123456
		console.log(typeof result); // string

		// 任何的值和字符串做+运算,都会先转换为字符串,然后拼串.
		result = 123 + "1"; //1231

		result = true + "hello"; // truehello

		
		// 可以将任意的数据类型转换为String,只需要为任意类型+ 一个""即可转换为String
		// 这是一种隐式的类型转换,有浏览器自动完成,实际上也是调用String()函数完成的.
		var c = 123;
		c = c + ''; // "123"
		console.log(typeof c);

		c = null
		c = c + ""; // "null"

		// 注意运算顺序
		result = 1 + 2 + "3";
		console.log("result =" + result); // "result = 33"

		result = "1" + 2 + 3; // "123"

		/*
		- 可以对值进行减法运算,并返回
		*/

		result = 100 - 5 ;  // 95
		result = 100 - true; // 99
		// 先转换成Number类型,再进行减法运算
		result = 100 - "1"; // 99
		result = "100" - "1"; // 99

		/*
			*可以对两个值进行乘法运算
		*/
		result = 2 * 2; // 4
		result = 2 * "8"; // 16
		result = "2" * "3"; // 6
		result = 2 * undefined; //NaN
		result = 2 * null ; // 0

		/*
			/ 可以对两个值进行除法运算
		*/
		result = 4 / 2; // 2
		result = 3 / 2; //1.5

		// 任何值做- * / 运算时都会自动转换为Number
		// 可以利用这一特点做隐式的类型转换,可以通过为一个值 -0 *1 /1 来将其转换为Number
		// 原理和Number()一样
		var d = "123"
		d = d - 0; // typeof d 为number

		/*
			% 取模运算(取余数)
		*/
		result = 9 % 3; // 0

		/*
			一元运算符,只需要一个操作数
			+ 正号
				- 正号不会对数值产生任何影响
			- 负号
				- 负号可以对数字进行符号的取反
			- 对于非Number类型的值,先将其转换为Number,再运算。
		*/
		a = 123;

		a = +a; // 123
		a = -a; //-123

		a = -2;
		a = +a; // -2
		a = -a; // 2

		a = true;
		a = -a; // -1

		a = "18"; // typeof a => string
		a = -a; //-18 typeof a => number

		//将其他类型转换为Number,使用+
		a = "18" // typeof a => string
		a = +a; // 18 typeof a => number

		result = 1 + "2" + 3; //"123"

		// 运算符的优先级
		result = 1 + +"2" + 3; // 6

		/*
		自增++:通过自增可以使变量在自身的基础上增加1,对于一个变量自增以后,原变量的值会立即自增。
		*/
		a = 1;
		a = a + 1; // 2
		// 等同于
		a++;

		++a;
		// 自增有两种,后++(a++)和前++(++a)。
		// 无论是a++,++a,都会立即使原变量的值自增1.不同的是,a++和++a的值不同.
		// a++ 的值等于自增前的值
		// ++a 的值等于自增后的值
		a = 1;
		console.log(a++); // 1
		console.log("a = " + a); // "a = 2"

		a = 1;
		console.log(++a);  // 2
		console.log("a = " + a) // "a = 2"

		c = 10;
		c++;
		console.log(c++); // 11
		console.log(c); // 12

		var d = 20;
		console.log(++d); // 21
		console.log(++d); // 22

		// d++ 20 d 21
		// ++d 22 d 22
		result = d++ + ++d + d;
		console.log(result); //64

		d = 20;
		//d++运行之后,d是21,d++是20,20赋值给d,d为20.
		d = d++;
		// 等价于
		var e = d++;
		d = e;

		/*
			自减--
			通过自减可以使变量在自身的基础上减1
			自减分成两种,后--(a--)和前--(--a)
			无论是a--还是--a,都会立即使原变量的值自减1,不同的是a--和--a的值不同.
			a--自减前的值
			--a是自减后的值
		*/
		var num = 10;
		num--;
		--num;

		/*
			JS中为我们提供了三种逻辑运算符
			!非 可以用来对一个值进行非运算,不改变原变量,所谓非运算就是对一个bool值进行取反操作。true变false。false变true。

			&& 与

			|| 或
		*/

		a = true;
		// 对a进行非运算
		a = !a; // false
		// 如果对一个值进行两次取反,则不会变换。
		a = !!a; // true

		// 如果对一个非bool值进行非运算,则会先转换为bool值,再取反。

		b = 10; // number

		b = !b; // false  bool

		// 可以利用该特点,将其他数据类型转为bool类型。可以为任意数据类型取两次反,转换为bool类型。

		a = "hello"; // string
		a = !!a; // true boolean

		// && 与
		// 可以对符号两侧的值进行与运算并返回结果
		// 如果两个值都为true则返回true
		result = true && true; // true
		// 只要有一个false,就返回false
		result = true && false; // false
		result = false && true; // false
		result = false && false; // false
		// JS中的与属于短路与,如果第一个值为false,则不会再看第二个
		// 第一个值为true,会检查第二个
		true && alert('你看我出不出来'); //会弹框
		// 第一个值为false,不会检查第二个
		false && alert('你看我还出不出来'); // 不会弹框

		// || 或
		// 可以对符号两侧的值进行或运算并返回结果
		// 如果两个值只要有一个true,则返回true。两个都为false,则返回false。
		// 两个都是false,则返回false.
		result = false || false; // false

		result = true || false; // true
		result = false || true; // true
		result = true || true; // true
		// JS中的或属于短路或,如果第一个值为true,则不会看第二个。
		// 第一个值为true,则不再检查第二个
		true || alert("123");
		// 第一个值为false,会检查第二个
		false || alert("123"); // 会弹框

		/*
			对于非bool值进行与或运算:
		 	非bool值的情况时,先将其转换为bool值,再运算,并且返回原值。
		 	与运算:
		 		如果第一个值为true,则返回第一个。
		 		如果第一个值为false,则直接返回第一个值。
		 	或运算:
		 		如果第一个值为true,则直接返回第一个。
		 		如果第一个值为false,则返回第二个。
		 	
		*/
		// 与运算,如果两个值都为true,则返回后面的
		// 与运算,如果两个值中有false,则返回false。
		// true && true
		result = 1 && 2; // 2
		result = 2 && 1; // 1
		// false && true
		result = 0 && 2; // 0
		result = 2 && 0; // 0
		// false && false
		result = NaN && 0; // NaN
		result = 0 && NaN: // 0

		// true|| true
		// 如果第一个值为true,则直接返回第一个值
		result = 1 || 2; //1
		result = 2 || 1; //2
		result = 2 || NaN;
		result = 2 || 0;

		// 如果第一个值为false,则直接返回第二个值。
		result = "" || "hello"; // "hello"
		result = -1 || "你好"; // -1

		/*
			赋值运算符
			= 可以将符号右侧的值赋值给左侧的变量
			+= a += 5 等价于 a = a + 5;
			-= a -= 5 等价于 a = a - 5;
			*= a *= 5 等价于 a = a * 5;
			/= a /= 5 等价于 a = a / 5;
			%= a %= 5 等价于 a = a % 5;
		*/
		a = 123; // a = 123

		a = a + 5; 
		// 等价于
		a += 5;

		a = a - 5;
		// 等价于
		a -= 5;

		/*
			关系运算符
			通过关系运算符可以比较两个值之间的大小关系
			如果关系成立,它会返回true,如果关系不成立,则返回false。
		*/
		/*
			> 大于号
			- 判断符号左侧的值是否大于右侧的
			- 如果关系成立,返回true,如果关系不成立,则返回false。
		*/
		result = 5 > 10; // false

		result = 5 > 4; // true

		result = 5 > 5; // false

		/*
			>= 大于等于
			- 判断符号左侧的值是否大于或等于右侧的值
			- 如果关系成立,则返回true。如果关系不成立,则返回false.
		*/
		result = 5 >= 5; // true

		result = 5 >= 10; // fals

		result = 5 >= 4; // true

		/*
			<= 小于等于
		*/
		result = 5 <= 10; // true

		/*
			非数值比较:
				先转换成数值,再进行比较。
				任何值和NaN进行任何比较都是NaN.
				特殊情况,如果两边都是字符串,不会将其转换为数字进行比较,而会分别比较字符串中字符的Unicode编码。
		*/
		console.log(1 > true ); // false
		console.log(1 >= true); // true
		console.log(1 > "0"); // true
		console.log(10 > null); // true
		console.log(10 > 'hello'); // false
		console.log(10 <= "hello"); // false
		console.log(true > false ); // true
		console.log("1" < "5"); // true
		console.log("11" < "5"); // true
		console.log(11 < "5"); // false

		console.log("a" < "b"); // true
		console.log("a" >= "b"); // false

		// 比较字符编码时,是一位一位进行比较
		console.log("abc"< "b"); // true
		console.log("bbc" < "bb"); // false

		// 比较中文没有意义
		console.log("戒" > "我"); // true

		// 如果比较的是两个字符串型的数字,可能会得到不可预期的结果,一定要转型!!
		console.log("1111111222" > "5"); // false
		// 可改为
		console.log("1111111222" > +"5"); // true

		/*
			相等运算符用来比较两个值是否相等,如果相等会返回true,否则返回false.

			使用 == 来做相等运算.
				当使用==比较两个值时,如果值的类型不同,将转换成相同的类型,再进行比较。
		*/
		a = 10;
		console.log(a == 4); // false

		console.log("1" == 1); // true

		console.log(true == "1"); // true

		console.log(true == 'hello'); // false

		console.log(null == 0); //false

		/*
			undefined 衍生自null
			所以这两个值做相等判断时,会返回true。
		*/
		console.log(undefined == null); // true

		/*
			NaN 不和任何值相等,包括他本身
		*/
		console.log(NaN == NaN); // false

		b = NaN;
		// 判断b的值是否是NaN
		/*
			可以通过isNaN()函数来判断一个值是否为NaN
			如果该值是NaN,则返回true,否则返回false。
		*/
		console.log(isNaN(b)); // true

		/*
			!= 不相等用来判断两个值是否不相等,如果不相等返回true,如果相等返回false。
			不相等也会对变量进行自动的类型转换,如果转换后相等,它也会返回false
		*/
		console.log(10 != 5); //true
		console.log("abcd" != "abcd"); // false
		console.log("1" != 1);

		/*
			===
			全等用来判断两个值是否全等,它和相等类似,不同的是它不会做自动的类型转换。
			如果两个值的类型不同,直接返回false。
		*/
		console.log("123" === 123); //false

		/*
			!==
			不全等:用来判断两个值是否不全等,和不等类似,不同的是它不会做自动的类型转换。
			如果两个值的类型不同,直接返回true。
		*/
		console.log("1" !== 1); // true

		/*
			条件运算符也叫三元运算符
			语法:
				条件表达式? 语句1:语句2
			执行流程,
				条件运算符在执行时,首先对条件表达式进行求值,
				如果该值为true,则执行语句1,并返回执行结果
				如果该值为false,则执行语句2,并返回执行结果
				当返回的结果是个非bool值,会先将其转换为bool值,再进行运算。
		*/
		true ? alert("语句1") : alert("语句2"); // 语句1
		a = 10;
		b = 20;
		c = 50;
		a > b ? alert('a大'): alert('b大'); // b大

		// 获取a和b中的最大值
		var max = a > b ? a : b;
		console.log("max =" + max);

		// 获取a b c 中的最大值
		max = max > c ? max : c;

		// 这种写法不推荐使用,不方便阅读
		max = a > b ? (a > c ? a : c ): (b > c ? b : c)

		"hello"? alert('语句1'): alert("语句2"); // 语句1

		""? alert("语句1"): alert("语句2"); // 语句2

		/*
			, 运算符
			使用,可以分割多个语句,一般可以在声明多个变量时使用
		*/

		// 使用 , 运算符同时声明多个变量
		// var a , b , c;

		// 可以同时声明多个变量并赋值
		// var a = 1, b = 2, c = 3;
		// alert(b);

		/*
			就和数学中一样,在JS中运算符也有优先级,
			比如: 先乘除 后加减
		*/
		result = 1 + 2 * 3; // 7

		/*
			如果|| 的优先级高,或者两个一样高,则应该返回3
			如果&& 的优先级高,则应该返回1
		*/
		result = 1 || 2 && 3;
		console.log(result); // 1

		/*
			可以通过()来改变优先级
		*/
		rsult = (1 || 2) && 3; // 3

	</script>
</head>
<body>

</body>
</html>
posted @ 2019-08-29 19:14  涂墨浅浅  阅读(111)  评论(0编辑  收藏  举报