JavaScript入门 =============== JavaScript 属于脚本语言,通常在浏览器上解释执行。 通常用于可视化和交互软件。 JavaScript是一种“动态类型语言”,这意味着不同于其他一些语言(如C、JAVA), 您不需要指定变量将包含什么数据类型. 变量(Variable) ---------------- 变量 是存储数据的容器。要声明一个变量,先输入关键字 let 或 var,然后输入合适的名称 :: let myVariable; var avar; var的作用域被规定为一个函数作用域,而let则被规定为块作用域,块作用域要比函数作用域小一些, 但是如果两者既没在函数中,也没在块作用域中定义,那么两者都属于全局作用域。 变量存储值的类型有字符串、数字、布尔值、数组及对象。 * String 字符串(一串文本):字符串的值必须用引号(单双均可,必须成对)扩起来。例如 :: let myVariable = 'hello'; * Number 数字:无需引号。 :: let myVariable = 10; * Boolean 布尔值(真/假): true/false 是 JavaScript 里的特殊关键字,无需引号。 例如 :: let myVariable = true; * undefined 未定义的,例如变量声明了但未赋值。 :: let myVariable; * null 特指对象的值未设置。在布尔运算中被认为是false。 * Array 数组:用于在单一引用中存储多个值的结构。 :: let myVar = [1, 'hello', 'world', 10]; 数组元素引用方法: myVariable[0], myVariable[1] * Object 对象:JavaScript 里一切皆对象,一切皆可储存在变量里。 let myVariable = document.querySelector('h1'); 现在推荐都使用let来声明变量, 因为它限制较为严格,对于重复定义变量,会立即出错。 查看变量类型 typeof myVariable 变量也可以隐式声明,例如直接赋值 :: a = 10 常量 ------ 通过 const 定义的变量与 let 变量类似,但不能重新赋值, 可以称为常量。 基本代码规范 ------------- * 赋值符号两边留一个空格 * 每行结束添加一个分号 let aa = 1; 运算符 -------- * 等于, ===, 测试两个值是否相等,并返回一个 true/false (布尔)值。 * 不等于 "!==", 和等于运算符相反,测试两个值是否不相等,并返回一个 true/false (布尔)值。 在代码中使用==和!=来判断相等和不相等,也是JavaScript中的有效运算符,但它们与===/!==不同, 前者测试值是否相同, 但是数据类型可能不同,而后者的严格版本测试值和数据类型是否相同。 例如 :: var a="123" var b=123 c = (a==b) d = (a===b) * instanceof 是否是对象的实例。 逻辑运算符 ----------- 逻辑运算符共有三个, 分别为"&&"、"||"和 "!"。 * "&&", 逻辑与, 如果第一个为真,则表达式值为第二个参数, 否则为第一个参数值。 * "||", 逻辑或, 如果第一个为假,则表达式值为第一个参数,否则为第二个参数值。 * "!", 逻辑非, 取反。 示例代码 :: let a = 3 && 4 let b = 0 || 3 let c = !b 类型转换 ---------- * Number函数, 类型转换为数字。 字符串 ------- 可以选择单引号或双引号来包裹字符串。 Number函数用来将字符串转换为数字类型 :: let myString = '12345'; let mm = Number(myString); typeof mm; 另一方面,每个数字都有一个名为 toString() 的方法,它将把它转换成等价的字符串 :: let myNum = 12345; let ss = myNum.toString(); typeof ss; 获得字符串的长度, 使用 length 属性. 输入以下的两行代码 :: let s1 = 'hello world'; s1.length; 取子字符串,使用slice方法,并传递上下索引 :: let s1 = 'hello world'; s1.slice(3); //从3到结尾 s1.slice(3,5); //从3到5 s1.slice(-3,-1); //从-3到-1 * charAt() 访问字符串的指定位置 :: let str = "Hello OpenWrt" str.charAt(6) * indexOf方法查询子字符串首次出现的位置, 返回-1, 表示没有此字符串。 可以指定查找的起始位置 :: let str = "Hello Beijing" str.indexOf("Bei") str.indexOf("Bei", 7) * 替换子字符串, replace方法,并返回替换后的字符串。 * split() 字符串分割,返回数组。传递一个分割字符sep。 * search() 查找字符串的返回索引,找不见返回-1 数组 ----- 数组是一个包含了多个值的对象, 数组元素可以为任意类型,有一个length属性获取数组长度。 var arr = [1, 3, 5]; var arr2 = []; var arr3 = new Array(); var arr4 = new Array(1,2,3,4); var arr5 = new Array(10); //长度为10的空数组。 var arr6 = [1,2,3,,,10]; //数组长度6 arr[10] = "hello"; //长度为11, 前面填undefiled 数组相关方法: * push() 在末尾增加元素,增加一个或多个,并返回数组元素个数。 * pop() 弹出最后一个元素并返回。 * shift() 弹出第一个元素并返回。 * unshift() 在数组最前面添加元素,并返回元素个数。 * reverse() 原地逆转数组元素的顺序。 * slice() 通过删除或替换现有元素或者原地添加新的元素来修改数组, 并以数组形式返回被修改的内容。此方法会改变原数组。 通常用于在中间添加元素 原型如下 :: array.splice(start[, deleteCount[, item1[, item2[, ...]]]]) - start 起始位置, 可以取负值,表示length+start位置,例如-1表示倒数最后一个位置。 - deleteCount 删除的个数。 - item1 ... 添加的部分。 * sort() 数组进行排序,默认正序。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码 单元值序列时构建的 可以有一个参数是比较函数。 arr = [1, 10, 20, 5, 9, 0] function compareFn(a, b){ if(a>b) return 1; if(a==b) return 0; return -1; } arr.sort(compareFn); * toString() 方法, 不需要参数,转化为字符串。 * concat() 连接两个数组,并返回。不改变原有数组。 * slice() 截取指定范围数组并返回,不改变原数组。 begin,表示开始位置,end表示结束位置。 arr.slice([begin[, end]]) * join() 数组转化为字符串,需要一个参数 :: let myNewString = myArray.join(','); 数组去重 ---------- 利用哈希 循环 ----- * while循环 * do while循环 * for循环 * for in循环,通常用于遍历数组中的所有数组元素,或者遍历对象的所有属性。 :: for 变量 in 对象 { 执行语句块 } 遍历为数组的下标。 函数 ------ 函数定义以function开头,函数参数类型不需要定义,没有返回值定义。示例如下 :: function multiply(num1, num2) { let result = num1 * num2; return result; } 匿名函数,通常赋值给一个变量 :: var f = function (参数列表){ } :: var f = new Function (参数列表)( 函数执行体 ) 函数调用 ---------- * 直接调用,函数默认都为windows对象下。采用window.fn(...)形式或fn(...)调用。 * 以call方式调用,形如: fn.call(window,...)调用,形参从第二个开始, * 以apply方法调用,形如: fn.apply(window,[...])调用, 参数为一个数组。 如果方法想连续调用,那方法返回this。 return this; call ----- apply ------ 立即执行函数 ------------- 预编译 ------- js会进行预编译, 系统会把函数声明提升到逻辑的最前面。即函数定义可以放在函数调用的代码块下面。 :: hello() function hello(){ console.log("hello world") } 事件 ----- 事件能为网页添加真实的交互能力。它可以捕捉浏览器操作并运行一些代码做为响应。 最简单的事件是 点击事件,鼠标的点击操作会触发该事件。 可尝试将下面的代码输入到控制台, 然后点击页面的任意位置 :: document.querySelector('html').onclick = function() { alert('别戳我,我怕疼。'); } 将事件与元素绑定有许多方法。在这里选用了 元素,把一个匿名函数(就是没有命名的函数, 这里的匿名函数包含单击鼠标时要运行的代码)赋值给了 html 的 onclick 属性。 包装类 ------- var a = new Number(123); var str = new String("hello"); var num = 10; num.len = 20; console.log(num.len); var str = "abcd" str.length = 2 console.log(str) Date对象 ---------- 获取时间 :: d = new Data() getDate() //返回一个月的某一天,(1-31) getMonth() //返回月份 (0-11), 实际情况要加一。 getFullYear() // 返回4位的年份 getDay() // 返回星期几, 0表示星期日,1表示星期一,依次类推。 构造一个日期:: setDate() //设置天 setFullYear() //设置年 setMonth() //设置月 Math对象 -------- * abs(x) 返回绝对值 * floor(x) 对数进行下舍入 * round(x) 四舍五入到最近的整数。 * round() 返回随机数 (0-1) DOM表单 -------- 表单,form标签 * action 返回该表单的提交地址 * reset() 重置表单 * submit() 提交表单。 JSON ------------ var obj = JSON.parse(str); //由JSON字符串转换为JSON对象 var str1 = JSON.stringify(obj); //由obj转换为字符串。 客户端存储 ------------ 新流派:Web Storage 和 IndexedDB 现代浏览器有比使用 cookies 更简单、更有效的存储客户端数据的 API。 Web Storage API 提供了一种非常简单的语法,用于存储和检索较小的、由名称和相应值组成的数据项。 当您只需要存储一些简单的数据时,比如用户的名字,用户是否登录,屏幕背景使用了什么颜色等等, 这是非常有用的。 IndexedDB API 为浏览器提供了一个完整的数据库系统来存储复杂的数据。这可以用于存储从完整的 用户记录到甚至是复杂的数据类型,如音频或视频文件。 Storage.setItem() 方法允许您在存储中保存一个数据项——它接受两个参数:数据项的名字及其值。试着把它输入到你的JavaScript控制台(如果你愿意的话,可以把它的值改为你自己的名字!) localStorage.setItem('name','Chris'); Storage.getItem() 方法接受一个参数——你想要检索的数据项的名称——并返回数据项的值。 现在将这些代码输入到你的JavaScript控制台: var myName = localStorage.getItem('name'); myName 在输入第二行时,您应该会看到 myName变量现在包含name数据项的值。 Storage.removeItem() 方法接受一个参数——你想要删除的数据项的名称——并从 web storage 中 删除该数据项。在您的JavaScript控制台中输入以下几行: localStorage.removeItem('name'); var myName = localStorage.getItem('name'); 为每个域名分离储存 每个域都有一个单独的数据存储区(每个单独的网址都在浏览器中加载). 你会看到, 如果你加载两个网站(例如google.com和amazon.com)并尝试将某个项目存储在一个网站上, 该数据项将无法从另一个网站获取。 存储复杂数据 — IndexedDB '''''''''''''''''''''''''' get ```````````` post ````````````` echart -------- 百度前端框架。 JS面试题 -------- 1, var和let的区别 2, 匿名函数? 3, 变量类型有几种, 变量的作用域? 4, 闭包 常见问题 ----------- 1,出现from origin 'null' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource 答: 这是响应头解决跨域请求问题,通常浏览器不允许跨域请求。 解决方法: 如果是go语言,在服务端将HTTP相应头上加上以下信息 :: resp.Header().Set("Access-Control-Allow-Origin", "*")