JS 逗号操作符

逗号操作符  对它的每个操作数求值(从左到右),并返回最后一个操作数的值。

示例代码:

var x = 1;

x = (x++, x);

console.log(x);
// 输出: 2

x = (2, 3);

console.log(x);
// 输出: 3

另一种用法:

var obj = {
  fun: function () {
    console.log(this === window, this === obj);
  }	
};

obj.fun();
// 输出: false true

(0, obj.fun)();
// 输出: true false

var test = obj.fun;
test();
// 输出: true false

上面的代码中, (0, obj.fun)(); 等同于 var test = obj.fun; test(); ,前者可以少引入一个临时变量。

参考资料:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Comma_Operator

分类至 JS/CSS
0条评论

解决 SheetJS 日期时间类型显示多出43秒的问题

最近在优化后台数据导出功能,把原先后台生成 Excel 的功能(PhpExcel太吃内存),改用 ajax 加载每页数据然后前端 JS 生成 Excel。

找到一个前端生成 Excel 的类库 SheetJS:https://github.com/SheetJS/js-xlsx,以及一篇使用介绍的博文:https://www.cnblogs.com/liuxianan/p/js-excel.html

在导出日期时间的数据列时,想当然的使用了 Date 类型,然后设置显示格式为 yyyy-mm-dd hh:mm:ss。可是最终结果却显示有偏差,莫名比原来的值多了43秒。

搜索了一下这个问题,发现早有人在 github 上提出来:https://github.com/SheetJS/js-xlsx/issues/1470。细看 SheetJS 官方的 README.md,其实这不算是一个 BUG,而是因为 Excel 采用了不同的时间显示方式,跟时区有一定关系。

解决这个问题最快的办法就是,遇到日期时间的数据列,直接使用 String 类型导出就好,不要用 Date。

但是这样会有一个问题,String 列无法像 Date 列一样做筛选。

那有没有一个完美的解决方案呢?有两个办法。

第一种:根据时区判断,在导入的日期时间值上减去差值。如我们的北京时间要减去43秒,最终显示到 Excel 上就不会有偏差了。

第二种:一个变通的方法,使用 Excel 公式拼接日期和时间,跳过时区的转换过程。如原始值 2019-08-12 14:50:10,用公式拼接:=DATEVALUE("2019-08-12")+TIMEVALUE("14:50:10")

分类至 JS/CSS
0条评论

error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed

前段时间把服务器的 OpenSSL 升级了到 1.1.1c 版本,今天安装 Composer 的时候报错了!

报错的指令为:

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

PHP 的错误日志记录如下:

PHP Warning:  copy(): SSL operation failed with code 1. OpenSSL Error messages:
error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in Command line code on line 1
PHP Warning:  copy(): Failed to enable crypto in Command line code on line 1
PHP Warning:  copy(https://getcomposer.org/installer): failed to open stream: operation failed in Command line code on line 1

经检查,报错是因为无法验证 CA 证书。

分类至 PHP
0条评论

MYSQL:int类型升级到bigint,对PHP开发语言影响

因为业务增长,原有的unsigned int已经不够使用,需要升级到unsigned bigint。

MYSQL整数支持的范围:https://dev.mysql.com/doc/refman/5.7/en/integer-types.html

Type Storage Minimum Value Maximum Value
  (Bytes) (Signed/Unsigned) (Signed/Unsigned)
TINYINT 1 -128 127
    0 255
SMALLINT 2 -32768 32767
    0 65535
MEDIUMINT 3 -8388608 8388607
    0 16777215
INT 4 -2147483648 2147483647
    0 4294967295
BIGINT 8 -9223372036854775808 9223372036854775807
    0 18446744073709551615

可以看到bigint支持的数量级非常大。虽然mysql字段类型调整了,但是我们的开发语言是否支持呢?

 

分类至 PHP
0条评论

浅谈PHP异常处理

阅读目录

1、PHP中异常的独特性

  PHP中的异常的独特性,即PHP中的异常不同于主流语言C++、java中的异常。在Java中,异常是唯一的错误报告方式,而在PHP中却不是这样,而是把所有不正常的情况都视作了错误进行处理。这两种语言对异常和错误的界定存在分歧。什么是异常什么是错误,两种语言的设计者存在不同的观点。

  PHP中的异常:

  是程序在运行中出现不符合预期的情况及与正常流程不同的状况。一种不正常的情况,按照正常逻辑本不该出的错误,但仍然会出现的错误,这是属于逻辑和业务流程的错误,而不是编译或者语法上的错误。

  PHP中的错误:

  是属于php脚本自身的问题,大部分情况是由错误的语法,服务器环境导致,使得编译器无法通过检查,甚至无法运行的情况。warning、notice都是错误,只是他们的级别不同而已,并且错误是不能被try-catch捕获的。

   在PHP中遇到任何自身错误都会触发一个错误,而不是抛出异常。PHP一旦遇到非正常代码,通常都会触发错误,而不是抛出异常。因此,如果想要使用异常处理不可预料的问题,是办不到的。

……

分类至 PHP
0条评论

PHP 数组 array_key_exists 与 isset 的区别

isset() 对于数组中为 NULL 的值不会返回 TRUE,而 array_key_exists() 会。 

<?php
$search_array = array('first' => null, 'second' => 4);

// returns false
isset($search_array['first']);

// returns true
array_key_exists('first', $search_array);
?> 

isset —— 检测变量是否已设置并且非 NULL。

array_key_exists —— 检查数组里是否有指定的键名或索引,跟值无关。

另外,手册评论里有人测试过,isset 的速度比 array_key_exists 要快一些。

分类至 PHP
0条评论

用 docker-compose 构建 lnmp 开发环境

基于 docker-compose,一键构建 lnmp 开发环境。搭建成功后,包含的容器/软件版本如下:

容器名称 基础镜像 当前安装成功版本
web-php php:7.2-fpm 7.2.21
web-nginx nginx:stable 1.16.0
web-mysql mysql:5.7 5.7.27
web-redis redis:latest 5.0.5

每个容器都是基于官方镜像构建。由于 php-fpm 官方镜像默认很多扩展没装上,这里单独做了一个 Dockerfile 文件来补充安装。

分类至 Docker
0条评论

Debian系统配置apt-get源

默认的官方 apt-get 源,在国内特别慢,执行 apt-get update 指令时几号没反应,而替换为阿里云的debian源可以大大加快速度。

先备份 /etc/apt/sources.list ,然后替换 /etc/apt/sources.list 为下面内容:

deb http://mirrors.aliyun.com/debian stable main contrib non-free
deb http://mirrors.aliyun.com/debian stable-proposed-updates main contrib non-free
deb http://mirrors.aliyun.com/debian stable-updates main contrib non-free
deb-src http://mirrors.aliyun.com/debian stable main contrib non-free
deb-src http://mirrors.aliyun.com/debian stable-proposed-updates main contrib non-free
deb-src http://mirrors.aliyun.com/debian stable-updates main contrib non-free

 

分类至 Linux
0条评论

PHP浮点数的一个常见问题的解答

关于PHP的浮点数, 我之前写过一篇文章: 关于PHP浮点数你应该知道的(All ‘bogus’ about the float in PHP)

不过, 我当时遗漏了一点, 也就是对于如下的这个常见问题的回答:

<?php
    $f = 0.58;
    var_dump(intval($f * 100)); //为啥输出57
?>

为啥输出是57啊? PHP的bug么?

我相信有很多的同学有过这样的疑问, 因为光问我类似问题的人就很多, 更不用说bugs.php.net上经常有人问…

分类至 PHP
0条评论

微信小程序——网络请求之关于referer

首先解释一下referer:

HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。

在微信小程序中:

网络请求的 referer 是不可以设置的,格式固定为 https://servicewechat.com/{appid}/{version}/page-frame.html,其中 {appid} 为小程序的 appid,{version} 为小程序的版本号,版本号为 0 表示为开发版。

总之,不要在head中写referer就可以了。

分类至 小程序
0条评论