js 急速入门之槅门窥视
js:前端通用的脚步语言
写到哪里
<!-- js:前端通用的脚本 语言 -->
<!-- 运行在前端的js -->
<h2>www.php.cn</h2>
<!-- <button onClick="alert(1)">Button1</button> -->
<!-- 1. 内联脚本 -->
<button onclick="document.querySelector('h2').classList.toggle('active');">
Button1
</button>
<!-- 2. 内部脚本 -->
<button onclick="activeTitle(this)">Button2</button>
<script>
function activeTitle() {
document.querySelector("h2").classList.toggle("active");
}
</script>
<!-- 3. 外部脚本 -->
<!-- 使用外部脚本 浏览器可以缓存,可以共享,推荐使用此方法 -->
<script src="outjs.js"></script>
总结: 1. 事件属性:内联脚本 2. script 标签中:内部脚本 3. script 标签的 src 属性中:外部脚本
变量与常量
<script>
// 1. 变量
// 声明
let userName;
console.log(userName);
let itemName = "手机";
console.log(itemName);
userName = "percy";
console.log(userName);
// 2. 常量
// 声明是必须初始化
const unitPrice = 3699;
console.log(unitPrice);
//3. 标识符
// 字母,数字,下划线,$;且不能用数字开始
// 严格区分大小写 userName,username 不是同一个变量
// 不得使用关键字和保留字
// 4. 命名方案
// 驼峰式:userName(小驼峰)
// pascal:UserName(大驼峰)
// 匈牙利式:oBtn,_sex,_salary (首字母小写表示变量类型,第二个单词开始首字母大写)
// js中推荐全部使用驼峰式,方法和函数使用Pascal,常量全部使用大写
</script>
总结:
变量用:let
常量用:const
尽量不要用 var
标识符只能用字母,数字,下划线,$;且不能用数字开始
使用小驼峰命名方案
变量类型与类型转换
- 原始类型:字符串(string),数值(number),布尔(boolean),undefined,null
注意:声明变量不给值系统默认 undefined
<script>
let o = null;
console.log(o, typeof o);
// 如何判断一个值是否是null呢? ===
if (o === null) console.log("null");
</script>
- 引用类型:数组,对象,函数
数组的值不限类型
<script>
let arr = [100, "phone", 6699];
console.log(arr);
console.log(arr instanceof Array);
console.log(arr instanceof Object);
// 怎么判断一个变量是数组呢?
console.log(Array.isArray(arr));
let items = {
id: 100,
name: "phone",
price: 6899,
};
console.log(items);
console.table(items);
// 判断是否是对象
console.log(items instanceof Object);
// 函数
function show() {
console.log(typeof num);
}
console.log(typeof show);
</script>
总结:
判断是否是数组:Array.isArray(arr)
判断是否是对象:instanceof Object
函数提升与重写
<script>
// 函数声明
// 命名规则 函数命名:动词 + 名词,变量和常量命名用名词
function getName(name) {
return name + " Welcome ";
}
// 调用
console.log(getName("yp"));
// 函数提升 :调用可以在函数声明之前书写
// 声明会自动提升到顶部
function getName(name) {
return " 欢迎 " + name;
}
// 1. 避免函数提升,写到匿名函数中(函数表达式)
let sum = function (a, b) {
return a + b;
};
// 2. 避免函数被重写:
// 将函数做为值,赋值给一个常量
const sum1 = function (a, b) {
return a + b;
};
console.log(sum1(1, 2));
</script>
函数参数与返回值
// 必选参数
let sum = function (a, b) {
return a + b;
};
console.log(sum(1, 2));
console.log(sum(1));
//可选参数,设置默认值
sum = function (a, b = 0) {
return a + b;
};
console.log(sum(1));
console.log(sum(1, 4));
sum = function (a, b, c, d) {
return a + b + c + d;
};
console.log(sum(1, 2, 3, 4));
// ... :归内参数,简化函数的参数声明
// 当参数比较多时可使用
sum = function (...arr) {
console.log(arr);
console.log(arguments);
// arguments 类数组:类似数组其实是对象
// 属性为从0递增的正整数,且有length 属性
// reduce()操作数组所以要转换
// Array.from(arguments) 可以将类数组转化为数组
console.log(Array.from(arguments));
// return arr.reduce(function (p, c) {
// return p + c;
// });
// 简化为箭头函数
// return arr.reduce((prev,curr)=>prev+curr);
return Array.from(arguments).reduce((prev, curr) => prev + curr);
// Array.of() 将独立元素封装成数组
console.log(Array.of(...arguments));
};
console.log(sum(1, 2, 3, 6));
let params = [1, 2, 3, 4, 5, 6];
console.log(params);
// ...:扩展参数,简化函数的调用参数
console.log(sum(...params));
// 函数都是单值返回 迭代器例外,如果想返回多个值,将结果封装到数组或对象中
// let getItems = function () {
// return [100, "phone", 6899];
// };
// 使用箭头函数简写
let getItems = () => [100, "phone", 6899];
console.log(getItems());
// 返回带有描述的内容就使用对象
// getItems = function(){
// return {id:100,name:"phone",price:6899};
// }
// 使用箭头函数简写
getItems = () => {
return { id: 100, name: "phone", price: 6899 };
};
console.log(getItems());
高阶函数
高阶函数:使用函数为参数或者将函数作为返回值的函数
// 1. 回调函数:自己不用给别人用的函数
// document.addEventListener("click",function () {
// alert("hello ...");
// })
// 使用箭头函数简写
document.addEventListener("click", () => alert("~~~world"));
// 2. 偏函数:当函数的参数比较多时,先传入必要的参数,其他更多的函数用函数的返回值传递
// 简化了声明时的参数
// let sum = function (a, b) {
// return function (c, d) {
// return a + b + c + d;
// };
// };
// 使用箭头函数简写
let sum = (a, b) => (c, d) => a + b + c + d;
// 调用
// let f1=sum(1,2);
// console.log(f1(3,4));
console.log(sum(1, 2)(3, 4));
// 柯里化(极端的偏函数) 简化了调用的参数
// sum = function (a) {
// return function (b) {
// return function (c) {
// return function (d) {
// return a + b + c + d;
// };
// };
// };
// };
// 使用箭头函数简写
sum = (a) => (b) => (c) => (d) => a + b + c + d;
// 简化调用
console.log(sum(1)(2)(3)(40));
// 4. 纯函数
// 完全独立于调用的上下文,返回值只能受到传入的参数影响
// function getDate () {
// return Date.now();
// }
// 使用箭头函数简写
getDate = () => Date.now();
// 以上不是纯函数
console.log(getDate());
箭头函数
箭头函数用来简化“匿名函数”的声明
如果函数体只有一条语句,可不写 return 和大括号
如果只有一个参数,小括号都可以不写
如果没有参数,小括号不能省
箭头函数没有原型属性 prototype,不能当构造函数用
箭头函数中的 this,始终与它的上下文绑定
let sum = function (a, b) {
return a + b;
};
//使用箭头函数简写
sum = (a, b) => a + b;
console.log(sum(3, 4));
let tips = (str) => console.log(str);
tips("欢迎新同学");
作用域与闭包
js 使用词法作用域或者叫静态作用域,总是和他的使用上下文绑定
js 三种作用域:全局,函数,块
// 1. 全局作用域:写在外面就是全局作用域
let title = "php ";
console.log(title);
// 2. 函数作用域:写在函数内
function getSite() {
// 函数内声明的变量是私有变量
// 函数中可以使用他的上下文的变量
let domain = "www.php.cn";
return title + domain;
}
console.log(getSite());
// 3. 块作用域
{
let a = 1;
const b = "hello";
var c = 2;
}
// console.log(a,b);
// 以后尽量不用var,因为var不支持块作用域
console.log(c);
// 4. 闭包:能够访问自由变量的函数
// 自由变量: 既不是函数的参数也是私有变量,存在于函数调用上下文中
// 非函数本身定义,而是上下文中的变量(可理解为父级中的变量)
let num = 1;
function add(a, b) {
let t = 0;
// t是私有变量,a,b是参数,num就是自由变量
return t + a + b + num;
}
function a() {
let n = 100;
// 这个返回的子函数就是闭包;闭包就是子函数
return function () {
return n;
};
}
// 使用箭头函数简写
getNum = () => {
let n = 200;
return () => n;
};
console.log(a()());
console.log(getNum()());
addNum = () => {
let n = 1;
return () => n++;
};
console.log(addNum()());
console.log(addNum()());
console.log(addNum()());
console.log("----------------");
let f1 = addNum();
console.log(f1());
console.log(f1());
console.log(f1());
立即执行函数
立即执行函数:IIFE
立即执行:声明完直接调用
有什么用处呢?可以模拟块作用域。
//立即执行函数:IIFE
function sum(a, b) {
console.log(a + b);
}
sum(10, 20);
//立即执行:声明完直接调用
(function sum(a, b) {
console.log(a + b);
})(10, 30);
((a, b) => console.log(a + b))(10, 40);
//用处?可以模拟块作用域
// if (true) {
// let b=888;
// }
// console.log(b);
//失败是因为let 声明的块作用域
//制作模块
let module = (function (name, email) {
return {
getName: () => "name:" + email,
getEmail: () => "email:" + email,
};
})("admin", "admin@php.cn");
console.log(module.getName());
总结:
回调函数:简而言之是自己的函数写好为别人服务提供服务器
纯函数:返回值只受到参数影响,不受上下文影响;
js知识点很多,仅用这些做入门三板斧吧。