HTMl 中的脚本必须位于 <script> 与 </script> 标签之间
脚本可被放置在 HTML 页面的 <body> 和 <head> 部分中。
xxxxxxxxxx191<!-- 1.js文件 -->2<head>3 <title>js</title>4 <script src="jsfile.js"></script>5</head>6<!-- 2.head中 -->7<head>8 <title>js</title>9 <script>10 document.wirte("Hello JS!");11 </script>12</head>13<!-- 3.body中 -->14<body>15 <p>这是第一段文字</p>16 <script>17 document.wirte("这是第二段文字")18 </script>19</body>5数据类型:
3对象类型:
2个不包含任何值的数据类型:
Js 是弱类型语言,不同类型可以共存和转换。
使用 typeof 操作符来查看 Js 变量的数据类型。
xxxxxxxxxx101typeof "John" // 返回 string2typeof 3.14 // 返回 number3typeof NaN // 返回 number4typeof false // 返回 boolean5typeof [1,2,3,4] // 返回 object6typeof {name: 'john', age:34} // 返回 object7typeof new Date() // 返回 object8typeof function() {} // 返回 function9typeof myCar // 返回 undefined (if myCar is not declared)10typeof null // 返回 object请注意:
所以,如果对象是 Js Array 或 Js Date ,我们就无法通过 typeof 来判断他们的类型,因为都是返回 Object 。
constructor 属性返回所有JavaScript 变量的构造函数。
xxxxxxxxxx71"John".constructor // 返回 function String() {[native code]}2(3.14).constructor // 返回 function Number() {[native code]}3false.constructor // 返回 function Boolean() {[native code]}4[1,2,3,4].constructor // 返回 function Array() {[native code]}5{name:'John',age:34}.constructor // 返回 funciton Object() {[native code]}6new Date().constructor // 返回 function Date() {[native code]}7function() {}.constrcutor // 返回 function Function() {[native code]} 利用 constrcutor 来判断对象是否为 数组
xxxxxxxxxx31function isArray() {2 return myArray.constructor.toString().indexOf("Array") > -1;3}利用 constructor 来判断对象是否为 日期
xxxxxxxxxx31function isDate() {2 return myDate.constructor.toString().indexOf("Date") > -1;3}String() , 适用于任何类型的 数字,字母,变量,表达式;
toString() ,同 String();
xxxxxxxxxx41String(123);2String(100 + 23);3(123).toString();4(100 + 23).toString();toExponential() ,把对象的值转换为 指数计数法;
toFixed() , 把数字转换为指定小数点后几位的字符串,银行家舍入;
不完全是银行家舍入,IE11符合银行家舍入,其余浏览器不完全符合;
关于银行家舍入;
xxxxxxxxxx71四舍六入五取偶,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一2toFixed(2);311.556 = 11.56 ------六入411.554 = 11.55 -----四舍511.5551 = 11.56 -----五后有数进位611.545 = 11.54 -----五后无数,若前位为偶数应舍去711.555 = 11.56 -----五后无数,若前位为奇数应进位
toPrecision() ,把数字格式化为指定的长度;
String() ;
xxxxxxxxxx21String(true) // 返回 "true"2String(false) // 返回 "false"toString() ;
xxxxxxxxxx21true.toString() // 返回 "true"2false.toString() // 返回 "false"String() ;
xxxxxxxxxx11String(Date())toString() ;
xxxxxxxxxx11Date().toString();更多方法:
Number() :字符串转换为数字
xxxxxxxxxx41Number("3.14"); // 返回 3.142Number(" "); // 返回 03Number(""); // 返回 0 4Number("99 88"); // 返回 NaNparseFloat() : 返回浮点数;
parseInt() : 返回整数;
一元运算符 + :
可用于将变量转换为数字;
xxxxxxxxxx21var y = "5"; // y 是一个字符串2var x = + y; // x 是一个数字如果不能转换,它仍然会是一个数字,但值为 NaN ;
xxxxxxxxxx21var y = "John"; // y 是一个字符串2var x = + y; // x 是一个数字 (NaN)全局方法 Number() :
xxxxxxxxxx21Number(false) // 返回 02Number(true) // 返回 1全局方法 Number() :
xxxxxxxxxx21d = new Date();2Number(d); // 返回 1404568027739日期方法 getTime() 效果一样 :
xxxxxxxxxx21d = new Date();2d.getTime(); // 返回 1404568027739当 JavaScript 尝试操作一个 "错误" 的数据类型时,会自动转换为 "正确" 的数据类型。
xxxxxxxxxx415 + null // 返回 5 because null is converted to 02"5" + null // 返回"5null" because null is converted to "null" 3"5" + 1 // 返回 "51" because 1 is converted to "1" 4"5" - 1 // 返回 4 because "5" is converted to 5当你尝试输出一个对象或者变量时,JavaScript会自动调用变量的 toString() 方法:
xxxxxxxxxx91document.getElementById("demo").innerHTML = myVar;23// if myVar = {name:"John"} // toString 转换为 "[object Object]"4// if myVar = [1,2,3,4] // toString 转换为 "1,2,3,4"5// if myVar = new Date() // toString 转换为 "Fri Jul 18 2014 09:08:55 GMT+0200"6// 数字和布尔值也会转换;7// if myVar = 123 // toString 转换为 "123"8// if myVar = true // toString 转换为 "true"9// if myVar = false // toString 转换为 "false"Json字符串 => Json对象
xxxxxxxxxx151var data = "{2root: 3[4 {name:1,value:'0'},5 {name:'6101',value:'北京市'},6 {name:'6102',value:'天津市'},7 {name:'6103',value:'上海市'},8 {name:'6104',value:'重庆市'},9]10}";11// 1. eval('(' + text + ')');12// ():把data 从语句块{},转换成 表达式 来处理13var dataObj = eval("("+data+")");14// 2. JSON.parse(text);15var dataObj1 = JSON.parse(data);Json对象 => Json字符串
xxxxxxxxxx41// JSON.stringify(jsonObj)2var strObj = {"name":"W3Cschool","site":"https://www.w3cschool.cn"};3var str = JSON.stringify(strObj);4document.write(str);字符串 => 数组
xxxxxxxxxx31// split()2var str = "123|345|7899|2233";3var arr = str.split('|');数组 => 字符串
xxxxxxxxxx51var arr = [1,2,3,4,5];2// 1. toString();3var str1 = arr.toString(); // 返回 "1,2,3,4,5"4// 2. join();5var str2 = arr.join("--"); // 返回 "1--2--3--4--5"xxxxxxxxxx101/pattern/modifiers;2/* 解释3 / : 开始标志4 pattern : 正则表单式5 / : 结束标志6 modifiers : 修饰符7*/89// 实例10var patt = /w3cschool/i修饰符有3个:
正则表达式使用 大写 来获得 取反效果 :
xxxxxxxxxx61var str = "cc 4 f5 66f7 g"2var reg1 = /\d/ig; // 返回 ["4","5","6","6","7"]3var reg2 = /\d+/ig; // 返回 ["4","5","66","7"]4var reg3 = /\D/ig; // 返回 ["c","c"," "," ","f"," ","f"," ","g"]5var reg4 = /\D+/ig; // 返回 ["cc "," f"," ","f"," g"]6var result = str.match(reg1); search() : 检索,返回起始位置(从0开始,找不到返回-1);
replace() :替换;
match() : 检索,返回数组或者null;
xxxxxxxxxx41var str = "Visit w3cschool";2var s1 = str.search(/w3cschool/ig); // 返回 63var r1 = str.replace(/w3cSCHOOL/ig "hello"); // 返回 Visit hello4var m1 = str.match(/s/ig); // 返回 ["s","s"]test() : 检索,匹配返回 true ,否则返回 false ;
exec() : 检索,匹配返回 检索条件 (返回结果也是数组,数组第一个元素为 检索条件) ,否则返回 null ;
compile() : 用于 改变检索条件 ,既可以改变检索模式,也可以添加或删除第二个参数;
xxxxxxxxxx101var patt = /e/;2patt.test("The best things in life are free!"); // 返回 true3patt.exec("The best things in life are free!"); // 返回 e4// exec 返回格式结果如下:5// /l/g.exec('hello world');6// ["l", index: 2, input: "hello world", groups: undefined]78//compile()9var patt1 = new RegExp("e");10document.write(patt1.test("The best things in life are free!"));11patt1.compile("d");12document.write(patt1.test("The best things in life are free!"));13//返回 truefalse表示点击后,什么也不会发生 。
void里可以是函数(事件),但不会有结果返回,但括号内的表达式还是要运行的。
javascript:void(0) 与 # 的区别:
a 标签添加事件:
href="javascript:void(0)" 或者 href="javascript:;" ,但是这样会导致页面跳转,解决方案如下:
111// 原代码:2<a href="javascript:void(0)" title="关闭" onclick="delbook();">关闭</a>3// 或者4<a href="javascript:;" title="关闭" onclick="delbook()">关闭</a>5// 以上方法onclick执行后可能会执行跳转,解决方案如下:6// return false;7<a href="javascript:void(0)" title="关闭" onclick="delbood();return false">关闭</a>8// target="_self"9<a href="javascript:void(0)" target="_self" title="关闭" onclick="delbook()">关闭</a>10// 或者直接这样写11<a href="javascript:delbook()" target="_self" title="关闭">关闭</a>函数后紧跟 () ,则会自动调用;通过添加括号,来说明它是一个函数表达式
xxxxxxxxxx31(function() {2 var x = "Hello!!"; // 我将调用我自己3})();缺少的默认参数为:undefined ;
xxxxxxxxxx91function myFunction(x,y) {2 if (y === undefined){3 y = 0;4 }5}6//或者更简单的方式7function myFunction(x,y) {8 y = y || 0;9}如果调用时设置了过多的参数,参数将无法被引用,因为无法找到对应的参数名。只能使用 arguments 对象来调用;
arguments : 包含了函数调用的 参数数组 ;
xxxxxxxxxx141// 找最大值2x = findMax(1,123,500,115,44,88);3function findMax() {4 var i, max = arguments[0];5 if (arguments.length < 2) {6 return max;7 }8 for (i = 0; i < arguments.length; i++) {9 if (arguments[i] > max) {10 max = arguments[i];11 }12 }13 return max;14}注意 :关于传递参数;
通过 值 传递参数:不会 修改参数的初始值(在函数外定义);
通过 对象 传递参数: 会 修改参数的初始值;
xxxxxxxxxx171// 值传递例子2var x = 1;3function myFunction(x) {4 x++; //修改参数x的值,将不会修改在函数外定义的变量 x5 console.log(x);6}7myFunction(x); // 28console.log(x); // 1910// 对象传递例子11var obj = {x:1};12function myFunction(x) {13 obj.x++; //修改参数对象obj.x的值,函数外定义的obj也将改变14 console.log(obj.x);15}16myFunction(obj); // 217console.log(obj.x); // 2作为一个函数调用 :
xxxxxxxxxx41function myFunction(a, b) {2 return a * b;3}4myFunction(10, 2); // 返回 20函数作为方法调用 :
xxxxxxxxxx81var myObject = {2 firstName:"John",3 lastName:"Doe",4 fullName: function() {5 return this.firstName + " " + this.lastName;6 }7}8myObject.fullName(); // 返回 "John Doe"使用构造函数调用函数 :
xxxxxxxxxx61function myFuntion(arg1, arg2) {2 this.firstName = arg1;3 this.lastName = arg2;4}5var x = new myFunction("John", "Doe");6x.firstName;作为函数方法调用函数 :
xxxxxxxxxx81function myFunction(a, b) {2 return a * b;3}4// call(),对象本身,参数arg1,参数arg2,参数argn···5myFunction.call(myObject, 10, 2); // 返回 206// apply(),对象本身,参数数组7var myArray = [10,2];8myFunction.apply(myObject,myArray); // 返回 20全称 文档对象模型(Document Object Model) 。通过 DOM ,你可以访问所有的 HTML 元素和它们所包含的文本和属性。
xxxxxxxxxx61// 改变 输出流2document.write(Date());3// 改变 HTML 内容4document.getElementById("demo").innerHTML="New text!";5// 改变 HTML 属性6document.getElementById("demo").src="landscape.jpg";xxxxxxxxxx21// 语法2document.getElementById(Id).style.property=new style;xxxxxxxxxx51// 改变 <p> 元素的样式2document.getElementById("p1").style.color="blue";3// 显示 和 隐藏文本4document.getElementById("p1").style.visibility='visible';5document.getElementById("p1").style.visibility='hidden';主要有以下几种情况:
| 属性 | 描述(触发条件) |
|---|---|
| onclick | 点击鼠标 |
| onmousemove | 元素内移动 |
| onmousedown | 鼠标按下 |
| onmouseup | 鼠标松开 |
| onmouseenter | 移入某元素,不冒泡,子元素不触发 |
| onmouseleave | 移出某元素,不冒泡,子元素不触发 |
| onmouseover | 移入某元素,可冒泡,子元素触发 |
| onmouseout | 移出某元素,可冒泡,子元素触发 |
useCapture : 传递类型
xxxxxxxxxx21<h1 onclick="this.innerHTML='Hello JS!'">点击文本</h1>2<div onmouseover="mOver(this)" onmouseout="mOut(this)">Mouse Over Me</div>onload 和 onunload 会在用户 进入 或 离开 页面时被触发
xxxxxxxxxx11<body onload="checkCookies()">onload
xxxxxxxxxx11<img src="demo.jpg" onload="loadImage()">onChange 会在用户输入字段改变时触发
xxxxxxxxxx11<input type="text" id="fname" onchange="upperCase()">| 属性 | 描述 |
|---|---|
| onblur | 元素失去焦点时 |
| onchange | 表单元素内容发生改变时 |
| onfocus | 元素获取焦点时 |
| onfocussin | 元素即将获取焦点时,不冒泡 |
| onfocusout | 元素即将失去焦点时,不冒泡 |
| oninput | 元素获取用户输入时 |
| onreset | 表单重置时 |
| onsearch | 用户在搜索域按"enter" 或者 点击旁边的 "x" 时 |
| onselect | 用户选取文本时 |
| onsubmit | 表单提交时 |
xxxxxxxxxx41<form action="demo-form.php" onsubmit="myFunction()">2 <input id="id1" onsearch="funSearch()">3 <input id="id2" onselect="funSelect()">4</form>| 属性 | 描述(触发条件) |
|---|---|
| onkeydown | 键盘按键被按下 |
| onkeypress | 键盘按键被按下并松开 |
| onkeyup | 键盘按键被松开 |
xxxxxxxxxx11<input type="text" onkeydown="myFunction()">xxxxxxxxxx41element.addEventListener(event, function, useCapture);2// 第一个参数是事件的类型(如 "click" 或 "mousedown");3// 第二个参数是事件触发后调用的函数;4// 第三个参数是boolean值,用于描述是 冒泡 还是 捕获,可选,默认false冒泡注意 : 不要使用 on 前缀。例如,使用 click ,而不是 onclick ;
在 DOM 中,每个节点都是一个对象。DOM节点有三个重要的属性,分别是:
nodeName : 节点的名称
nodeValue : 节点的值
nodeType : 节点的类型
先创建该元素(元素节点 名称和值),然后向一个已存在的元素追加该元素;
xxxxxxxxxx131<div id="div1">2 <p id="p1">This is a paragrahp.</p>3 <p id="p2">This is another paragraph.</p>4</div>56<script>7var para = document.createElement("p");8var node = document.createTextNode("This is new.");9para.appendChild(node);10 11var element = document.getElementById("div1");12element.appendChild(para);13</script>找到你要删除的元素和 其父元素 ,然后删除;
xxxxxxxxxx101<div id="div1">2 <p id="p1">This is a paragrahp.</p>3 <p id="p2">This is another paragraph.</p>4</div>56<script>7var parent = document.getElementById("div1");8var child = document.getElementById("p1");9parent.removeChild(child);10</script>常用方案 : 找到待删除的子元素,然后用 parentNode 属性来找到其父元素;
xxxxxxxxxx21var child = document.getElementById("p1");2child.parentNode.removeChild(child);JavaScript 中的所有事物都是对象:字符串、数值、数组、函数...
数字不分整数类型和浮点型类型,所有数字都是 浮点型类型 ,64位浮点格式;
| 值(aka Fraction/Mantissa) | 指数 | Sign |
|---|---|---|
| 52 bits( 0 - 51 ) | 11 bits (50 - 62) | 1 bit (63) |
精度 : 整数(不使用小数点或指数计数法)最多为15位;小数的最大位数为17位;
八进制 : 前缀为0;
十六进制 : 前缀为0x;
当运算结果溢出,返回为无穷大(infinity),负无穷大为 -infinity ,基于它们的所有运算返回的结果仍为 infinity (保留正负号);
NaN : number 类型,但 非数字,通过 isNaN() 来判断;
常用方法: search,replace,match,indexOf;
大小写转换
xxxxxxxxxx31var txt = "Hello World!";2var txt1 = txt.toUpperCase(); //upper3var txt2 = txt.toLowerCase(); //lowerString => Array
xxxxxxxxxx21var txt = "a,b,c,d,e"; //string2var arr = txt.split(","); //array特殊字符 : 用 \ 转义;
JS 中的数组长度不是固定;
xxxxxxxxxx41var arr1 = new Array();2arr1[0] = "111";3arr2[1] = "222";4arr3[2] = "333";xxxxxxxxxx11var arr2 = new Array("111","222","333");xxxxxxxxxx11var arr3 = ["111","222","333"];一个数组中可以有不同类型的对象;
使用 prototype 来创建新方法;
xxxxxxxxxx81Array.prototype.ucase = function() {2 for (i=0;i<this.length;i++){3 this[i]=this[i].toUpperCase();4 }5}67var fruits = ["Banana", "Orange", "Apple", "Mango"];8fruits.ucase();concat() : 合并2个数组;
join() : 用数组拼成字符串;
pop() : 删除数组最后一个元素;
push() : 数组末尾添加新的元素;
shift() : 删除数组的第一个元素;
unshift() : 数组开头添加新的元素;
reverse() : 将数组中的全部元素反转排序;
slice(x,y) : 从数组中选择新元素;x <= arr < y;生成新数组;
splice(x,n,item···) : 从数组中x位置开始,删除n个元素,然后添加item1,item2,item···;
substr(s,l) : 从字符串s位置开始,截取l长度个元素,然后返回。s小于0时从右往左取;l小于0返回空;
substring(s,e) : 从字符串s开始开始,截取到e(前一)位置的字符串,然后返回;s <= str < e 。s小于0时从0开始取;
sort() : 按字母顺序排序;
可以修改为按数字顺序升序/降序;
xxxxxxxxxx51var points = [40,100,1,5,25,10];2points.sort(); //字母升序 [1,10,100,25,40,5]3points.sort(function(a,b){return a-b}); //数字升序 [1,5,10,25,40,100]4points.sort(function(a,b){return b-a});5//数字降序 [100,40,25,10,5,1]只有2个值,true 和 false ;
除了 0,-0,null,"",false,undefined,NaN 为 false ,其它都为 true ;
利用 !! 可以精简代码;
xxxxxxxxxx71if (x!=null && x!= undefined && x!="" && x!=···){2 return true;3}4//等价于5if (!!x){6 return true;7}xxxxxxxxxx51var str = "hello w3cschool!!";2var patt1 = /w3cschool/i;3var patt2 = new RegExp("w3cschool");4var patt3 = new RegExp(/\d+/g);5var result = str.match(patt1);Window 对象表示一个浏览器窗口或一个框架。Window 对象是全局对象,所有的表达式都在当前的环境中计算。
Window 主要有以下几个子对象:
execCommand 方法是执行一个对当前文档,当前选择或者给出范围的命令。
处理 HTML 数据时常用如下格式: document.execCommand(sCommand,[交互方式,动态参数]):
其他见 execCommand函数 。
浏览器对象模型(Browser Object Model)。
Window 对象是 BOM 中所有对象的核心,除了是 BOM 中所有对象的父对象外,还包含一些窗口控制函数。
Window 对象在使用时可以不使用 window 这个前缀。
xxxxxxxxxx21var wid = screen.availWidth; // 可用的屏幕宽度2var hei = screen.availHeight; // 可用的屏幕高度window.location 用于获取当前页面的地址(URL),并把浏览器重新定向到新的页面;
location.hostname : 返回 web 主机的域名(包含 www 或 二级域名);
location.pathname : 返回当前页面的路径和文件名;
location.port : 返回 web 主机的端口 (80或443);
location.protocol : 返回所使用的 web 协议(http:// 或 https://);
location.href : 返回当前页面的 URL (//www.xxx.com/xx...);
location.assign : 加载新的文档;
xxxxxxxxxx11window.location.assign("http://www.w3cschool.cn");window.history 包含浏览器的历史。
history.back() : 与在浏览器点击 后退 按钮相同;
history.forward() : 与在浏览器点击 前进 按钮相同;
history.go() : 接收一个整数作为参数,移动到该整数指定的页面;
来自 navigator 对象的信息具有误导性,不应该被用于检测浏览器版本,这是因为:
由于 navigator 可误导浏览器检测,可使用对象检测来嗅探不同的浏览器。
xxxxxxxxxx31if (window.opera){2 //this is Opera browser;3}消息弹窗分三种:警告框、确认框、提示框。
警告框 : alert;
确认框 : confirm,点击 "确认" 返回 true ,点击 "取消" 返回 false ;
提示框 : prompt ,点击 "确认" 返回 输入的值 ,点击 "取消" 返回 null ;
xxxxxxxxxx201//alert2alert("你好,我是一个警告框!");3//confirm4function funConfirm() {5 var r = confirm("按下按钮!");6 if (r) {7 console.log("已点击'确定'");8 } else {9 console.log("已点击'取消'");10 }11}12<input type="text" value="点我" onclick="funConfirm()">13//prompt14 function funPrompt() {15 var p = prompt("请输入你的名字","Harry Potter");16 if (p!=null && p!="") {17 console.log("你好" + p);18 }19}20<input type="text" value="点我" onclick="funPrompt()">setTimeout() : 暂停指定的毫秒数后 执行1次 指定的代码;
clearTimeout : 停止 setTimeout() 执行的方法;
setInterval() : 间隔指定的毫秒数 不停的执行 指定的代码;
clearInterval() : 停止 setInterval() 执行的方法;
xxxxxxxxxx161// setTimeout && clearTimeout2var myVar1;3function myFunction() {4 var myVar1 = setTimeout(function() {alert("hello setTimeout")}, 3000);5}6function myStopFunction() {7 clearTimeout(myVar1);8}9// setInterval && clearInterval10var myVar2;11function myFunction() {12 var myVar2 = setInterval(function() {alert("hello setInterval")}, 3000);13}14function myStopFunction() {15 clearInterval(myVar2);16}Cookies 用于存储 web 页面的用户信息,存储在客户端。