简单js

作者: drlsxs | 来源:发表于2021-07-26 19:20 被阅读0次
  1. 使用 连续 三元 ? 来代替 if else-if
let message,
  login = "";

message =
  login === "dsfds"
    ? "dsasdas"
    : login === "dssa"
    ? "fsdfdsfs"
    : login === ""
    ? "no login"
    : "";

console.log(message); //--------no login---------

2.使用 ? 三元 来代替 if else

let a = 2,
  b = 1;
let result = a + b < 4 ? "Blow" : "Over";
console.log(result); //-----------Blow----------

3.|| 或运算的, 有真及真,返回第一个真值,如果不存在真值,就返回该链的最后一个值。

console.log(true || true); //----true----
console.log(false || true); //----true----
console.log(true || false); //----true----
console.log(false || false); //----false----

4.&& 与运算的, 有假及假,返回第一个虚值,如果不存在虚值,就返回该链的最后一个值。

console.log(true && true); // ----true----
console.log(false && true); // ----false----
console.log(true && false); // ----false----
console.log(false && false); // ----false----

5.空值合并运算符 '??'

function fn(a, b) {
  return a + b;
}

let aa = 0,
  bb = null;
console.log(fn(aa ?? 10, bb ?? 22)); // --------22---------
// 与 || 区别
// || 返回第一个 真 值。
// ?? 返回第一个 已定义的 值。
let x = 0;
let y = "";
let z = undefined;
let n = null;
console.log(x || 20); //  -----20---------
console.log(x ?? 20); //  -----0---------
console.log(y || 30); //  -----30---------
console.log(y ?? 30); //  -----“”---------
console.log(z || 40); //  -----40---------
console.log(z ?? 40); //  -----40---------
console.log(n || 50); //  -----50---------
console.log(n ?? 50); //  -----50---------
// 可以看出 ?? 不认为 0 或 “”为假,||会认为为假

6.内部循环变量和外部循环变量

// 内联循环变量声明,外部拿不到值
for (let i = 0; i < 3; i++) {
  console.log(i); // ------0,1,2-------
}
try {
  console.log(i);
} catch (error) {
  console.log(error); //----ReferenceError: i is not defined-----
}
//外部循环变量,外面可以拿到值
let k = 0;
for (k = 0; k < 3; k++) {
  console.log(k); // ------0,1,2---------
}
console.log(k); //--------3-------

7.if内部使用!和不使用!

// 简单一句话flag为真值就执行下面的代码,带!flag为真,即flag为假
let flag = false;
if (flag) console.log("hhaha");
if (!flag) console.log("wwawa"); //------wwawa -----

8.case连写,相当于if判断中的 ||

let browser = "Chrome";
switch (browser) {
  case "Edge":
    console.log("You've got the Edge!");
    break;
  case "Chrome":
  case "Firefox":
  case "Safari":
  case "Opera":
    console.log("Okay we support these browser too"); //---Okay we support these browser too ---
    break;
  default:
    console.log("We hope that this page looks ok!");
}
// 用if,else if ,else改写的判断
let browser2 = "Firefox";
if (browser2 === "Edge") {
  console.log("You've got the Edge!");
} else if (
  browser2 === "Chrome" ||
  browser2 === "Firefox" ||
  browser2 === "Safari" ||
  browser2 === "Opera"
) {
  console.log("Okay we support these browsers too"); //---Okay we support these browser too ---
} else {
  console.log("We hope that this page looks ok!");
}

9.为什么要使用 === 判断是否相等;

let a1 = 10;
let a2 = "10";
console.log(a1 == a2); //-----true----,我们期望得到false却得到了true

10.外部变量和内部变量,外部和内部是两个完全不一样的变量,彼此修改不会影响对方的值。

let username = "John"; //外部变量username,

function showMessage() {
  let username = "drlsxs"; //内部变量username
  username = "Bob"; // 修改内部变量,外部变量任然为John
  let message = "Hello, " + username;

  console.log(message); // ---Hello, Bob ---
}
showMessage();
console.log(username); //----John ----

11.两种写入函数默认参数的方法

//直接默认参数写入发,不会有0或“”问题
function showMessage1(from, text = "no text given1") {
  console.log(from + ": " + text);
}
showMessage1("Ann"); // Ann: no text given1
//后备默认参数写入法
function showMessage2(from, text) {
  text = text || "no text given2"; //可以使用 ??代替 || 以防参数为“”或0
  console.log(from + ": " + text);
}
showMessage2("Ann"); // Ann: no text given2

12.一个函数 —— 一个行为
一个函数应该只包含函数名所指定的功能,而不是做更多与函数名无关的功能。
两个独立的行为通常需要两个函数,即使它们通常被一起调用(在这种情况下,我们可以创建第三个函数来调用这两个函数)。
有几个违反这一规则的例子:

  • getAge —— 如果它通过 alert 将 age 显示出来,那就有问题了(只应该是获取)。
  • createForm —— 如果它包含修改文档的操作,例如向文档添加一个表单,那就有问题了(只应该创建表单并返回)。
  • checkPermission —— 如果它显示 access granted/denied 消息,那就有问题了(只应执行检查并返回结果)。
    这些例子假设函数名前缀具有通用的含义。你和你的团队可以自定义这些函数名前缀的含义,但是通常都没有太大的不同。无论怎样,你都应该对函数名前缀的含义、带特定前缀的函数可以做什么以及不可以做什么有深刻的了解。所有相同前缀的函数都应该遵守相同的规则。并且,团队成员应该形成共识。

如下:显示素数函数不应该去判断这个数是不是素数...

function showPrime(n) {
  nextPrime:for (let i = 2; i < n; i++) {
    for (let j = 2; j < i; j++) {
      if (i%j===0) continue nextPrime;
    }
    console.log(i);
  }

}

showPrime(100);

应该改为两个函数的形式,一个展示素数,一个去判断素数

// 展示素数函数
function showPrimes(n) {
  for (let i = 2; i < n; i++) {
    //不应该自己判断,交给函数isPrime判断
    if (isPrime(i)) continue;
    console.log(i);
  }

}

// 判断素数函数
function isPrime(i) {
  for (let j = 2; j < i; j++) {
    if ( i % j === 0) return true;
  }
  return false;
}

showPrimes(100);

13.简化函数内部的判断
如下:
基本判断

function checkAge(age) {
  if (age > 18) {
    return true
  } else {
    return `Did parents allow you?`
  }
}

使用省略else来简化if else

function checkAge(age) {
  if (age>18) return true
  return `Did parents allow you?`;
}

使用 ? 或者|| 近一步简化函数返回结果

//使用问号运算符 '?':
function checkAge(age) {
  return (age > 18) ? true : `Did parents allow you?`;
}
//使用或运算符 ||(最短的变体)
function checkAge(age) {
  return (age > 18) || `Did parents allow you?`;
}

14.可以考虑传入对象作为函数参数, 避免对参数顺序的依赖

function getInfo(name, id, age) {
  console.log(`姓名:${name},id:${id},年龄:${age}`);
}

getInfo(1, 20,"drlsxs");    //------姓名:1,id:20,年龄:drlsxs -------

function getInfo2(userObj) {
  const {name,age,id} = userObj
  console.log(`姓名:${name},id:${id},年龄:${age}`);
}

getInfo2({age:20, id: 1, name: "drlsxs"})  //----------姓名:drlsxs,id:1,年龄:20-----------

15.简单promise,以及执行顺序

let promise = new Promise((resolve, reject) => {
  console.log(1)
  let a = 9;
  (a < 10) ? resolve(a) : reject("a is not number");
});

promise.then(res => {
  console.log(2)
}, err => {
});

console.log(3)         

//  输出顺序-----------------1,3,2--------------------//

16.可选连访问对象中不存在的属性的问题
假设我们有一个use对象存储用户信息,其中有个address属性存放地址信息,我们想要访问address里面的street,如果address是undefined我们就会得到一个错误


image.png

可选连是一种新特性,其规则如下:
value?.prop

  • 如果 value 存在,则结果与 value.prop 相同,
  • 否则(当 value 为 undefined/null 时)则返回 undefined。
    所以上面访问对象不存在的属性我们可以用如下方法:


    image.png
let user = {
name: "dsada",
}; // 一个没有 "address" 属性的 user 对象

console.log(user.address?.street); // Error!

也不用写三元表达式去判断

console.log(user.address ? user.address.street : undefined);

17.对象操作:
对象缺少数组存在的许多方法,例如 map 和 filter 等。
如果我们想应用它们,那么我们可以使用 Object.entries,然后使用 Object.fromEntries:
1.使用 Object.entries(obj) 从 obj 获取由键/值对组成的数组。
2.对该数组使用数组方法,例如 map。
3.对结果数组使用 Object.fromEntries(array) 方法,将结果转回成对象。

let prices = {
  banana: 1,
  orange: 2,
  meat: 4
};


/**
 * @param {{[p: string]: T}} price
 */
function doublePrices (price) {
  return Object.fromEntries(
    Object.entries(price).map(([key, value]) => [key, value * 2])
  );
}

console.log(doublePrices(prices)); //{ banana: 2, orange: 4, meat: 8 }

18.从数组创建键(值)对象

let users = [
  {id: 'john', name: "John Smith", age: 20},
  {id: 'ann', name: "Ann Smith", age: 24},
  {id: 'pete', name: "Pete Peterson", age: 31},
];


/**
 *
 * @description 收到数组对象,获取到该数组对象的以id作为键名的对象,方便读取数组对象中的实体
 * @param array{array}
 * @return {object}
 */
function groupById(array) {
  let obj = {};
  return array.reduce((acc, curr) => {
    obj[curr.id] = curr;
    return obj;
  }, {});

}

let usersById = groupById(users);
console.log(usersById);
console.log(usersById.ann.age); // 24

// {
//   john: { id: 'john', name: 'John Smith', age: 20 },
//   ann: { id: 'ann', name: 'Ann Smith', age: 24 },
//   pete: { id: 'pete', name: 'Pete Peterson', age: 31 }
// }

相关文章

  • 简单的node模块

    简单school模块 student.js teacher.js class.js index.js (用clas...

  • 简单js

    使用 连续 三元 ? 来代替 if else-if 2.使用 ? 三元 来代替 if else 3.|| 或运算的...

  • 浅谈JS原型和原型链

    学习使用过js的人一开始都会觉得js简单,这是因为js语法简单,学习过编程语言的人,很容易掌握js的基本语法并按要...

  • 简单的node.js

    一:简单的Node.js介绍简单的说Node.js是运行在服务端的javascriptNode.js 是基于Chr...

  • nodejs安装

    Node.js安装 目录 Node.js简单介绍 windows安装Node.js Linux安装Node.js ...

  • 2018-08-22

    今天简单了解了一下关于js对象的知识点。包括JS 数字 JS 字符串 JS 日期 JS 数组 JS 逻辑 JS 算...

  • 原生JS添加一个JS文件

    原生JS添加一个JS文件其实比较简单:

  • uniapp请求的封装

    uinapp 发送请求的简单封装 api.js main.js

  • Vue 实现展开折叠效果

    使用插件 页面需要引入这个js 页面使用: js 另外一种简单的 html js style

  • 零碎的小程序笔记

    目录 template的简单使用WXS的简单使用npm的简单使用倒计时js的实现wx:for的使用一些js方法记录...

网友评论

      本文标题:简单js

      本文链接:https://www.haomeiwen.com/subject/bxtvmltx.html