91課:面試題。
1.局部變量和全局變量
f2();
console.log(cc); // 9
console.log(bb); // 9
console.log(aa); //錯誤
function f2(){
var aa = bb = cc = 9;
console.log(aa); // 9
console.log(bb); // 9
console.log(cc); // 9
};
2.作用域提升
var a = 123;
f1();
function f1(){
//var a;
var b=456;
console.log(a); // undefined
console.log(b); // 456
var a = '12306';//會把var a;提升
}
3.運算符和運算符的優先級別
一元操作符:++,--,+,-
邏輯操作符:!, &&, ||
基本運算符:+,-,,/,%
關系操作符:>,<,>=,<=,===,==,!==,!=
條件運算符:a? b : c;
賦值運算符:+=,-+,=,/=,%=
逗號運算符:,
優先級 | |
---|---|
第一位: | () |
第二位: | |,-,+,++,--.(這里的-+是一元運算符) |
第三位: | *,/,% |
第四位: | +,- |
第五位: | <,<=,>,>= |
第六位: | ==,!=,===,!== |
第七位: | && |
第八位: | || |
第九位: | a? b : c; |
第十位: | =,+=,-=,*=,/=,%= |
面試題
var aa = 0&&1;
alert(aa); // 0
var bb = 1&&0;
alert(bb); // 0
var cc = 1&&8;
alert(cc); // 8
var a = 1 && 3 && 5;
alert(a); // 5
var b = 0 && 2 && 4;
alert(b); // 0
var c = 5 && 0 && 7;
alert(c); // 0
console.log(0||1); // 1
console.log(1||0); // 1
console.log(1||3); // 1
console.log(3||1); // 3
var a = 5 && 0 || 1; // 1
var b = 4 || 0 && 8; // 4
var c= 0 || 8 && 9; // 9
alert(a),alert(b),alert(c);
var a = 4 + 8 && 3; // 3
var b = 0 && 7 + 1; // 0
var c = 4 || 3 && 8-1; // 4
alert(a),alert(b),alert(c);
92課:數組常用API補充
一.Array的內置方法
1.Instanceof
是一個關鍵字,判斷A是否是B類型。
布爾類型值 = A Instanceof B
運算符用來測試一個對象在其原型鏈中是否存在一個構造函數的 prototype 屬性。
和typeOf比較(typeof作用:用于判斷一個一個表達式,(對象或者原始值),返回一個字符串。返回的可能的值)
- typeof判斷所有變量的類型,返回值有number,boolean,string,function,object,undefined。
- typeof對于豐富的對象實例,只能返回"Object"字符串。
- instanceof用來判斷對象,代碼形式為obj1 instanceof obj2(obj1是否是obj2的實例),obj2必須為對象,否則會報錯!其返回值為布爾值。
- instanceof可以對不同的對象實例進行判斷,判斷方法是根據對象的原型鏈依次向下查詢,如果obj2的原型屬性存在obj1的原型鏈上,(obj1 instanceof obj2)值為true。
2.Array.isArray()
H5新增,判斷是不是數組。
布爾類型值 = Array.isArray(變量);
調用者:Array 參數:變量(被檢測值) 返回值:布爾類型
3.toString()
把數組轉化成字符串,每一項用 , 分割。
字符串 = 數組.toString();
4.valueOf()
返回數組對象本身。數組本身 = 數組.valueOf()
5.join()
用于把數組中的所有元素放入一個字符串。元素是通過指定的分隔符進行分隔的。
字符串 = 數組.join(分隔符);
分隔符可以有也可以沒有,不寫默認用逗號分割,無縫連接用空字符串。
//1. Instanceof
var arr = [1, 2, "哈哈哈"]; // Array
console.log(typeof arr); // object
console.log(arr instanceof Array);
//2. Array.isArray()
var arr1 = [1, 2, "哈哈哈"];
var arr2 = new Array();
var name = "jack";
console.log(Array.isArray(arr1));
console.log(Array.isArray(arr2));
console.log(Array.isArray(name));
//3. toString()
var arr = [1, 2, "哈哈哈", 212121, 323232];
console.log(arr.toString());
console.log(typeof arr.toString()); // string
//4.valueOf()
console.log(arr.valueOf());
//5. indexOf()、lastIndexOf()
var arr = [1, 2, 33, 2, 1];
console.log(arr.indexOf(2));
console.log(arr.indexOf(12));
console.log(arr.lastIndexOf(2));
console.log(arr.lastIndexOf(22));
二.數組增刪和換位置(原數組將被修改)
indexOf
從前向后索引字符串位置(參數:索引字符串)
從前面尋找第一個符合元素的位置,找不到則返回-1。
lastIndexOf
從后向前索引字符串位置(參數:索引字符串)
從后面尋找第一個符合元素的位置,找不到則返回-1;
map()
方法定義在JavaScript的Array中,我們調用Array的map()方法,傳入我們自己的函數,就得到了一個新的Array作為結果
reduce()
reduce的用法。Array的reduce()把一個函數作用在這個Array的[x1, x2, x3...]上,這個函數必須接收兩個參數,reduce()把結果繼續和序列的下一個元素做累積計算,其效果就是:
[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)
###### `=>`是[es6語法](https://github.com/lukehoban/es6features)中的`arrow function`
舉例:
(x) => x + 6;
相當于
function(x){
return x + 6;
}
item定義和用法
item() 方法節點列表中位于指定索引的節點。
以下兩條語法產生相同的結果:
document.body.childNodes.item(0);
document.body.childNodes[0];
sort()
為sort()中傳入排序規則函數可實現自定義排序
排序函數規則:
傳兩個形參
當返回值為正數時,交換傳入兩形參在數組中位置
排序的內置算法:
JS中sort實現算法居然是O(n^2)的冒泡排序,所以有時候有必要自己實現那些算法
93-96課:JS特效-字符串操作補充
1.轉換成字符串(三種方法)
//+ toString() String()
var str = '張三';
var age = 18;
console.log(typeof str); // string
console.log(typeof (age + ''));
console.log(typeof age.toString());
console.log(typeof String(age));
2.根據位置返回字符串
charAt
獲取相應位置字符(參數:字符位置)。
字符串中第一個字符的下標是0,如果參數index不再0與string.length之間,將返回一個空字符串。
獲取相應位置的字符(參數:索引值)。
charCodeAt
獲取相應位置字符編碼。
兩個方法都用于選取字符串中某一位置上的單個字符。
區別:charCodeAt()方法返回字符在Unicode字符集中的編碼值。
var str = "a,Hello World";
var str1 = "你好,中國!";
console.log(str.charAt(1));
console.log(str.charAt(7));
console.log(str1.charAt(4));
console.log(str.charCodeAt(0));
console.log(str1.charCodeAt(0));
Unicode
(統一碼、萬國碼、單一碼)是計算機科學領域里的一項業界標準,包括字符集、編碼方案等。Unicode 是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統一并且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。1990年開始研發,1994年正式公布。
- 能夠使計算機實現跨語言、跨平臺的文本轉換及處理。
ASCII
ASCII 是用來表示英文字符的一種編碼規范。每個ASCII字符占用1 個字節,因此,ASCII 編碼可以表示的最大字符數是255(00H—FFH)。這對于英文而言,是沒有問題的,一般只什么用到前128個(00H--7FH,最高位為0)。而最高位為1 的另128 個字符(80H—FFH)被稱為“擴展ASCII”,一般用來存放英文的制表符、部分音標字符等等的一些其它符號。
- ASCII:8bits的英文編碼,實際使用低7位,127個字符。32(0x20)為空格,之前是控制字符,之后是有效字符。
-
Unicode:使用兩字節對全球字符進行統一編碼,有65536個編碼,UCS-2為兩字節版本(2^16 =65536)。
微信圖片_20181224194543.png
// 1.字符串
var str = "Hello World!";
var str1 = "你好,世界!12121";
/* console.log(str.length);
console.log(str1.length * 2 - 2);*/
console.log(getStrLength(str1));
console.log(getStrLength(str));
/**
* 獲取字符串的真實長度
* @param {string}str
* @returns {number}
*/
function getStrLength(str) {
// 1.定義變量
var len = 0, code = 0;
// 2. 遍歷
for (var i = 0; i < str.length; i++) {
// 2.1 Unicode碼
code = str.charCodeAt(i);
// console.log(code);
// 2.2 判斷
if (code >= 0 && code <= 127) {
len += 1;
} else {
len += 2;
}
}
// 3. 返回長度
return len;
}
3.根據字符返回位置。
indexOf
從前向后索引字符串位置(參數:索引字符串)
從前面尋找第一個符合元素的位置,找不到則返回-1。
lastIndexOf
從后向前索引字符串位置(參數:索引字符串)
從后面尋找第一個符合元素的位置,找不到則返回-1;
- 索引值 = 數組.indexOf()/lastIndexOf()(數組中的元素);
4.uri編碼和解碼
- encodeURIComponent() 函數可把字符串作為 URI 組件進行編碼。
- decodeURIComponent() 函數可對 encodeURIComponent() 函數編碼的 URI 進行解碼。
var str = "http://www.itmoma.com?name=yann";
var str1 ="http://localhost:63342/%E4%B8%8A%E8%AF%BE%E4%BB%A3%E7%A0%81/05-JS%E7%89%B9%E6%95%88-%E4%B8%8B/05-uri%E7%BC%96%E7%A0%81%E5%92%8C%E8%A7%A3%E7%A0%81.html?_ijt=h8d2tjqjlprces058v6s86p9ji";
// 1. 編碼
var encodestr = encodeURIComponent(str);
console.log(encodestr); // http%3A%2F%2Fwww.itmoma.com%3Fname%3Dyann
// 2. 解碼
var decodeStr = decodeURIComponent(str1);
console.log(decodeStr);
console.log(decodeURIComponent("https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=0&rsv_idx=1&tn=baidu&wd=%E5%93%88%E5%93%88%E5%93%88&rsv_pq=bcd9c87700072f06&rsv_t=dc09UzZ2JpOa7o%2FDZ969ycvMaFxlARDd1LWKS%2FNnWeCCtroOis%2BJrD3%2B3qk&rqlang=cn&rsv_enter=0&rsv_sug3=5&rsv_sug1=4&rsv_sug7=100&inputT=3148&rsv_sug4=3473"));
5.截取字符串(重點)
concat()
連接字符串。連接兩個或更多的數組,并返回結果。
slice()
從某個已有的數組返回選定的元素。arrayObject.slice(start,end)
substr()
可在字符串中抽取從 start 下標開始的指定數目的字符。stringObject.substr(start,length)
substring()
提取字符串中介于兩個指定下標之間的字符。stringObject.substring(start,stop)
6.小數位數 toFixed()。把 Number 四舍五入為指定小數位數的數字。
var PI = 3.1436592653;
console.log(PI.toFixed(3));//3.144
// 保留兩位小數 后面小數會四舍五入
7.轉換大小寫
toUpperCase,轉換為大寫(參數:無)
toLowerCase,轉換為小寫(參數:無)
var str = "hello world!";
var str1 = "HELLO WORLD!";
console.log(str.toUpperCase());//HELLO WORLD!
console.log(str1.toLowerCase());//hello world!
-
作業
-
- 1.將一個字符串數組輸出為|分割的形式,比如“劉備|張飛|關羽”,使用兩種方式實現
var arr = ['劉備','張飛','關羽'];
/*arr.splice(1,0,'|');
arr.splice(3,0,'|');
console.log(arr);
console.log(arr.toString());*/
var str = arr.toString();
console.log(str.replace(/,/g, '|'));
console.log(arr.join('|'));
- 2.找到數組中每個字母出現的次數['c','a','z','a','a']
//const countOccurences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0);//箭頭函數
function countOccurences(arr,value) {
return arr.reduce(
function (a,v) {
return v === value ? a + 1 : a + 0;
},0)
}
console.log('[1,3,4,6,1,3,5,6,3,1]中 1 出現的次數是:'+countOccurences([1,3,4,6,1,3,5,6,3,1],1));
- 3.工資的數組[1500,1200,2000,2100,1800],把工資超過2000的刪除。
var arr1 = [1500,1200,2000,2100,1800,500,2500];
for(var i = 0;i < arr1.length;i++){
if(arr1[i] > 2000){arr1.splice(i,1);}
}
console.log(arr1);
97.JS特效-上傳圖片格式驗證
- onchange 事件會在域的內容改變時發生。
<label>上傳圖片的格式驗證:</label>
<input type="file" id="file">
-------------------------------------------------------------------------
/*
jpg png gif
*/
window.onload = function () {
// 1. 獲取標簽
var file = document.getElementById('file');
// 2. 監聽作用域的變化
file.onchange = function () {
// 2.1 獲取上傳圖片的路徑
var path = this.value;
// console.log(path);
// 2.2 截取
var suffix = path.substr(path.lastIndexOf('.'));
// console.log(suffix);
// 2.3 統一轉成小寫
var lower_suffix = suffix.toLowerCase();
// console.log(lower_suffix);
// 2.4 判斷
if(lower_suffix === '.jpg' || lower_suffix === '.png' || lower_suffix === '.jpeg' || lower_suffix === '.gif'){
alert('上傳圖片正確');
}else {
alert('上傳圖片不正確');
}
}
}